1.题目描述:点击打开链接
2.解题思路:本题利用KMP算法中失配函数的性质解决。我们仔细观察失配函数f就会发现,如果一个字符串P是一个周期串,且它的最后一个位置是i,那么i-f[i]一定是该周期串的一个最小的循环节的长度,这样,最大的k值就是i/(i-f[i])。这样,我们只需要寻找f[i]>0(因为k>0,因此不能让i-f[i]==i)且i%(i-f[i])==0的位置即可。
3.代码:
#include<iostream> #include<algorithm> #include<cassert> #include<string> #include<sstream> #include<set> #include<bitset> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<cctype> #include<functional> #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define me(s) memset(s,0,sizeof(s)) #define rep(i,n) for(int i=0;i<(n);i++) typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; //typedef pair <int, int> P; const int N=1000000+10; char P[N]; int f[N]; int main() { int n,kase=0; while(scanf("%d",&n)==1&&n) { scanf("%s",P); f[0]=f[1]=0; for(int i=1;i<n;i++) { int j=f[i]; while(j&&P[i]!=P[j])j=f[j]; f[i+1]=P[i]==P[j]?j+1:0; } printf("Test case #%d\n",++kase); for(int i=2;i<=n;i++) if(f[i]>0&&i%(i-f[i])==0) //注意要让f[i]>0 printf("%d %d\n",i,i/(i-f[i])); puts(""); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-05 06:54:13