https://vjudge.net/contest/280658#problem/B
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char c[1900099];
int n,m,i,j,k,next[2000000];
int main()
{
while (scanf("%s",c+1))
{
if (c[1]=='.') break;
memset(next,0,sizeof(next));
next[1]=0;// 下标从1开始
m=strlen(c+1);
for (int i = 2; i <= m; ++i)
{
int k=next[i-1];
if(c[k+1]==c[i]) ++k;
else
{
while(k>0 && c[k+1]!=c[i]) k=next[k];
if(c[k+1]==c[i]) ++k;
}
next[i]=k;
}
int l=m-next[m];
if(m%l == 0)
printf("%d\n",m/l);
else
printf("1\n");
}
}
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define p 1000000007
#define ll long long
using namespace std;
char s[1000005];
ll l,a,b,lst,bin[1000005];
ll pows(ll a,ll b)
{
ll base=1;
while(b)
{
if(b&1) base=base*a%p;
a=a*a%p;
b/=2;
}
return base;
}
int main()
{
bin[0]=1;
for(ll i=1; i<=1000000; i++) bin[i]=bin[i-1]*233%p;
while(~scanf("%s",s+1))
{
if(s[1]=='.') break;
l=strlen(s+1);
lst=0;
a=0;
b=0;
for(ll i=1; i<=l; i++) a=(a*233+s[i])%p;
for(ll i=l; i>=1; i--)
{
if(l%i) continue;
for(ll j=lst+1; j<=l/i; j++) b=(b*233+s[j])%p;
lst=(l/i);
ll x=((b*(bin[l]-1+p)%p)*(pows(bin[l/i]-1,p-2)%p))%p;
if(x==a)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}