Pagini recente » Cod sursa (job #212421) | Cod sursa (job #2099375) | Cod sursa (job #2091946) | Cod sursa (job #1549536) | Cod sursa (job #170092)
Cod sursa(job #170092)
#include <stdio.h>
#include <string.h>
#define K 2000009
char ch,A[K],B[K];
int pi[K],poz[1001];
int teste,k,M,N;
void make_prefix()
{
int i,q=0;
for(pi[1]=0,i=2 ;i<= M ;++i)
{
while ( q && A[q+1]!=A[i] ) q = pi[q];
if (A[q+1] == A[i]) ++q;
pi[i]=q;
}
}
void solve()
{
int nr=1,max=0,n=0,q=0;
make_prefix();
for(int i=1;i<=N;++i)
{
while( q && A[q+1]!=B[i] ) q=pi[q];
if (A[q+1]==B[i]) ++q;
if ( q==M )
{
q=pi[M]; ++n;
if (n<=1000) poz[n]=i-M;
}
}
//if(n>1)
//printf("%d\n", n*M);
//else printf("0\n");
for(int i=2;i<=n;++i)
{
if(poz[i]-poz[i-1]==M)
++nr;
else
nr=1;
if(nr>max)
max=nr;
}
printf("%d\n", max*M);
}
void scan()
{
freopen("prefix.in", "r",stdin);
freopen("prefix.out", "w",stdout);
scanf("%d%c", &teste,&ch);
for(int t=1;t<=teste;++t)
{
gets(B+1);
N=strlen(B+1);
A[1]=B[1];
for(k=2;k<=N;++k)
{
if(B[k]==B[1])
break;
A[k]=B[k];
}
M=k-1;
/*for(int i=1;i<=M;++i)
printf("%c", A[i]);
printf(" ");*/
solve();
}
}
int main()
{
scan();
return 0;
}