这个题是一个好题,题意比较简单,我就不赘述了。能让你对kmp的认识更近一步吧。我以前对kmp的理解仅限于动态规划或者前后缀之类的层次上。自己浅薄。
ac代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; const int maxn=1000000+5; char s[maxn]; int n,next[maxn],ncas; void init() { memset(s,0,(n+5)*sizeof(char)); } void data_in() { scanf("%s",s); } void get_next() { int i,j; i=0; j=-1; next[0]=-1; while(i<n) { if(j==-1||s[i]==s[j]) i++,j++,next[i]=j; else j=next[j]; } } int main() { ncas=1; while(scanf("%d",&n),n) { init(); data_in(); get_next(); printf("Test case #%d\n",ncas++); for(int i=1;i<=n;i++) { int slen=2*next[i]-i; int cir=next[i]-slen; if(slen>=0&&i%cir==0) printf("%d %d\n",i,i/cir); else continue; } printf("\n"); } return 0; }
欢迎批评指正。谢谢!