题目
题意:
给出一个字符串,找所有能表示成K*T的位置(K>1),并给出相应的T。 n≤1000000
解:
第i个位置的最短循环结长度为 i+1-nex[i+1]…
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
#define mes(a,x,s) memset(a,x,(s)*sizeof a[0])
#define mem(a,x) memset(a,x,sizeof a)
#define ysk(x) (1<<(x))
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn= 1000000 ;
char P[maxn+10];
int n,nex[maxn+10];
void getfail()
{
nex[0]=nex[1]=0;
for(int i=1;i<n;i++)
{
int j=nex[i];
while(j&&P[j]!=P[i]) j=nex[j];
nex[i+1]=P[j]==P[i]?j+1:0;
}
for(int i=2;i<=n;i++)
{
if(nex[i]&& i%(i-nex[i])==0 ) printf("%d %d\n",i,i/(i-nex[i])); //nex[i]不等于0,代表...
}
putchar('\n');
}
int main()
{
std::ios::sync_with_stdio(false);
int kase=0;
while(cin>>n&&n)
{
cin>>P;
printf("Test case #%d\n",++kase);
getfail();
}
return 0;
}