Pagini recente » Cod sursa (job #327686) | Cod sursa (job #1085050) | Cod sursa (job #2750550) | Cod sursa (job #2572169) | Cod sursa (job #291530)
Cod sursa(job #291530)
#include<stdio.h>
#define Q 10005
char N[Q],M[Q];
int n,m,pi[Q],v[Q],k,num;
bool ok;
void p()
{
k=0;
pi[1]=0;
for (int i=2; i<=m; ++i)
{
while (k&&M[k+1]!=M[i])
k=pi[k];
if (M[k+1]==M[i])
++k;
pi[i]=k;
}
}
void kmp()
{
k=0;
num=0;
for (int i=1; i<=n; ++i)
{
while (k&&M[k+1]!=N[i])
k=pi[k];
if (M[k+1]==N[i])
++k;
if (k==m)
{
v[++num]=i-m;
ok=true;
if (v[num-1]+m>v[num])
{
--num;
ok=false;
}
else
if (v[num-1]+m<v[num])
break;
k=pi[m];
}
}
}
void citire()
{
freopen("prefix.in","r",stdin);
freopen("prefix.out","w",stdout);
int x;
scanf("%d\n",&x);
for (int i=1; i<=x; ++i)
{
fgets(N,sizeof(N),stdin);
n=0;
while (N[n])++n;--n;
for (int j=n; j; --j)N[j]=N[j-1];
N[0]=' ';
int n1=n/2,j=1;
M[0]=' ';
int max=0;
while (j<=n1)
{
M[j]=N[j];
m=j;
p();
kmp();
if (ok)
--num;
if (max<num*m)
max=num*m;
++j;
}
printf("%d\n",max);
}
}
int main()
{
citire();
return 0;
}