poj 1961 Period (KMP)
2013-12-28 14:25
337 查看
题目:http://poj.org/problem?id=1961
题意:跟2406 差不多,算是2406的升级版。就是每一个字符都要加一个判断。。
next匹配
next_val匹配
题意:跟2406 差不多,算是2406的升级版。就是每一个字符都要加一个判断。。
next匹配
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char t[1000005]; int len_t,ne[1000005]; void get_next() { int i=0,j=-1,x; ne[0]=-1; while(i<len_t) { if(j==-1||t[i]==t[j]) { ++i; ++j; ne[i]=j; x=i-j; if(i%x==0&&i/x>=2) cout<<i<<" "<<i/x<<endl; } else j=ne[j]; } } int main() { int x=1; while(~scanf("%d",&len_t)&&len_t) { scanf("%s",t); printf("Test case #%d\n",x++); get_next(); cout<<endl; } return 0; }
next_val匹配
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char t[1000005]; int len_t,ne[1000005]; void get_next() { int i=0,j=-1,x; ne[0]=-1; while(i<len_t) { if(j==-1||t[i]==t[j]) { ++i; ++j; if(t[i]!=t[j]) ne[i]=j; else ne[i]=ne[j]; x=i-j; if(i%x==0&&i/x>=2) cout<<i<<" "<<i/x<<endl; } else j=ne[j]; } } int main() { int x=1; while(~scanf("%d",&len_t)&&len_t) { scanf("%s",t); printf("Test case #%d\n",x++); get_next(); cout<<endl; } return 0; }
相关文章推荐
- POJ 1961 Period(KMP求一个串的重复子串)
- poj 1961 Period KMP
- POJ 1961Period / POJ 2406 Power Strings / POJ 3461 Oulipo /SDUT 2747 循环节 初涉KMP
- (简单) POJ 1961 Period,扩展KMP。
- POJ 1961-Period:KMP
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- POJ 1961-Period (KMP)
- poj 1961 Period [kmp, next数组的用法]
- POJ 1961 Period( KMP )*
- poj 1961 Period 【KMP】
- [poj 1961]Period[kmp]
- poj 1961 Period (KMP 最短循环节)
- poj_2406Power Strings && poj_1961Period && poj_2752Seek the Name, Seek the Fame(KMP)
- POJ 1961 Period KMP(next数组应用)
- POJ 1961 Period(KMP)
- poj 1961 Period (KMP+最小循环节)
- poj 1961 Period---kmp
- POJ-1961(Period)(kmp())
- POJ 1961 Period (KMP)
- POJ - 1961 Period(KMP)