Pagini recente » Cod sursa (job #2779663) | Cod sursa (job #1139923) | Cod sursa (job #3137173) | Cod sursa (job #1669491) | Cod sursa (job #195674)
Cod sursa(job #195674)
#include <cstring>
#include <cstdio>
#define MAX_N 1000001
#define max(a,b) (a > b? a : b)
int K[MAX_N]; //prefix
int length;
void makePrefix(char *data)
{
int i, q = 0;
for (i = 2, K[0] = 0; i <= length; ++i)
{
while(q > 0 && data[q+1] != data[i])
q = K[q];
if (data[q+1] == data[i]) q++;
K[i] = q ;
}
}
int findPrecs(char *data)
{
makePrefix(data);
/*
Pentru a gasi un sir de o anumita periodicitate P trebuie sa respecte urmatoarele 2 conditii :
K[P] > 0
P % (P - K[P])
*/
int iMaxDim = 0;
for (int i = length ; i >= 2 ;i--)
if (K[i] > 0 && (i % (i - K[i]) == 0))
{
iMaxDim = i;
break;
}
return iMaxDim;
}
void solve()
{
int n;
scanf("%d",&n);
char sir[MAX_N];
for (int i=0;i<n;i++)
{
scanf("%s\n",&sir);
length = strlen(sir);
for (int j = length; j >= 1;j--)
sir[j] = sir[j-1];
printf("%d\n",findPrecs(sir));
}
}
int main()
{
freopen("prefix.in","r",stdin);
freopen("prefix.out","w",stdout);
solve();
return 0;
}