HDU3746 Cyclic Nacklace(KMP_Next的应用)
2015-07-27 21:11
393 查看
题意:给一个字符串,求再在后面添加几个字符串可以使得整个字符串循环。
#include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> #include <queue> #include <stack> #include <vector> #include <string> #include <string.h> #include <map> #include <set> using namespace std; #define maxn 200000+5 int Next[maxn]; void getNext(string str) { int i,j; int len=str.length(); Next[0]=Next[1]=0; for(i=1;i<len;i++) { j=Next[i]; while(str[i]!=str[j]) { if(j==0)break; j=Next[j]; } if(str[i]==str[j]) Next[i+1]=j+1; else Next[i+1]=0; } } int main() { int t,j,k,ji; string str; cin>>t; while(t--) { cin>>str; getNext(str); int len=str.length(); ji=Next[len]; if(ji==0) { cout<<len<<endl;continue; } if(len%(len-ji)==0)//周期为len-Next[len],如果刚好len 是它的整数倍,那么本身就是循环的 { cout<<"0"<<endl;continue; } if(ji<=len/2)//如果next[len]<=len/2,肯定中间不会有重合的 { cout<<len-ji*2<<endl;continue; } else//最后这种情况就是中间重合的 { k=len-Next[len];//它最大长度为Next[len],先算出它的周期 cout<<k-Next[len]%k<<endl;//Next[len]%k的意思是:假设Next[len]==5,周期为3,则剩余部分就为2 } } return 0; }
相关文章推荐
- 串的模式匹配
- 增强for循环
- 排序算法 java实现2
- Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用
- #10
- UVa 12716 - GCD XOR(筛选+规律)
- poj 2594 Treasure Exploration 二分图匹配
- eclipse完全支持jsp页面下HTML/JS/CSS智能提示
- 常用集合类
- nyoj-02 括号配对问题
- deep learning入门教材
- java内部类,异常--09
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )
- 搭建SVN
- QPropertyAnimation动画的控件看不到以及构造函数的属性如何来
- BZOJ 3122 SDOI2013 随机数发生器 数论 EXBSGS
- 可变参数:参数可变
- Collections:集合工具类
- Eclipse和debug的一些快捷键
- Linux命令行之文件操作