kmp例题
原题:
题解:找最短循环节,定义:nxt[i] 为 1-i的最长相同前后缀长度,循环节长度为n-nxt[n]
//#include<bits/stdc++.h> #include<cstdio> #include<cstring> #define reg register using namespace std; const int N=1e6+10; char str[N]; int nxt[N],n; int main(){ // freopen("poj2406.in","r",stdin); while(1){ scanf("%s",str+1); if(str[1] == '.')break; n=strlen(str+1); nxt[0]=-1; for(reg int i=1,j;i<=n;i++){ j=nxt[i-1]; while(j!=-1 && str[i]!=str[j+1]) j=nxt[j]; nxt[i]=++j; } int t=n-nxt[n]; if(n%t==0)printf("%d\n",n/t); else printf("1\n"); } return 0; }
Kmp 模板