poj 1782 Run Length Encoding 自动机处理字符串
2015-09-20 20:12
423 查看
题意:
给一个字符串,要将它按规则转化为新字符串,规则有1)重复的比如aaaa转化为4a,如果重复次数超过9分开处理。2)不重复的片段在两端加1输出,如234输出1234,如果不重复片段中有1则加1个1输出,如2134输出1211341。
分析:
用自动机处理比较简单,自动机是一种能规范分支讨论的方法,而且自动机能帮助构建逻辑且代码简洁不易出错。
代码:
给一个字符串,要将它按规则转化为新字符串,规则有1)重复的比如aaaa转化为4a,如果重复次数超过9分开处理。2)不重复的片段在两端加1输出,如234输出1234,如果不重复片段中有1则加1个1输出,如2134输出1211341。
分析:
用自动机处理比较简单,自动机是一种能规范分支讨论的方法,而且自动机能帮助构建逻辑且代码简洁不易出错。
代码:
//poj 1782 //sep9 #include<iostream> using namespace std; const int maxN=1000024; char s[maxN],ans[maxN]; int state; int find(int i) { if(s[i]=='\0') return i; state=0; int j; for(j=i+1;s[j]!='\0';++j) if(state==0){ if(s[j]!=s[j-1]){ state=1; continue; }else{ state=2; continue; } }else if(state==1){ if(s[j]!=s[j-1]){ continue; }else{ return j-1; } }else if(state==2){ if(s[j]!=s[j-1]){ return j; }else{ if(j-i+1==10) return j; continue; } } return j; } int main() { while(gets(s)){ int p=0; for(int i=0;s[i]!='\0';){ int j=find(i); if(state==1||state==0){ ans[p++]='1'; for(int k=i;k<j;++k){ if(s[k]=='1') ans[p++]='1'; ans[p++]=s[k]; } ans[p++]='1'; }else if(state==2){ ans[p++]=j-i+'0'; ans[p++]=s[i]; } i=j; } ans[p]='\0'; puts(ans); } return 0; }
相关文章推荐
- 九大内置对象及四大作用域
- 信息安全系统设计基础第一周学习总结
- Java中重载和重写的区别
- NYOJ 76 超级台阶 (斐波那契)
- hdu 5464 Clarke and problem (BestCoder Round #56 (div.2))
- 技术人生:故事之三十六 放弃骑士时代
- [LeetCode] Move Zeroes - 整数数组处理问题
- MapReduce的InputFormat学习过程
- usaco Magic Squares
- HTTP劫持后续查查xjcf168.com
- 转 Java this、super使用总结
- 软件测试基础整理(第1章-到6章)
- 样式(style)和主体(theme)的回顾温习
- Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系
- 2015北京网络赛 A题 The Cats' Feeding Spots 暴力
- c++爱问的面试问题
- android中AdapterView的观察者模式
- vmware disk space
- 技术人生:故事之三十五 金钱第二
- C++ string详解