poj 1961

来源:互联网 发布:neu的数据分析 编辑:程序博客网 时间:2024/05/17 06:56

循环节是i-next[i];

第一次超时是没直接用n,多用了strlen;

代码如下

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int nextt[1000005];char s[1000005];int n;void Pre_next(char s[]){int k,j;j=0;nextt[0]=k=-1;while(j<n){if(k==-1||s[j]==s[k]) nextt[++j]=++k;else k=nextt[k];} } int main(){int cnt=0;while(scanf("%d",&n)){if(n==0) break;scanf("%s",s);Pre_next(s);printf("Test case #%d\n",++cnt);for(int i=1;i<=n;i++){int len=i-nextt[i];if(i!=len&&i%len==0)printf("%d %d\n",i,i/len);}printf("\n");}}