Pagini recente » Cod sursa (job #875089) | Cod sursa (job #998532) | Cod sursa (job #82543) | Cod sursa (job #2086937) | Cod sursa (job #345914)
Cod sursa(job #345914)
# include <stdio.h>
# include <string.h>
const long int MAXL=1000000;
char cuvant[11][MAXL+10];
long int prefix[MAXL+1],perioada[MAXL+1];
long int det_lungime(char *s)
{
long int m,li=1,lf=MAXL;
while (li<=lf)
{
m=(li+lf)/2;
if (s[m]&&!s[m+1]) return m;
if (s[m]) li=m+1;
else lf=m;
}
return li;
}
long int det_prefix(char *s, long int n)
{
long int i,already=0,sol=0;
prefix[1]=0;perioada[1]=1;
for (i=2;i<=n;i++)
{
while (already&&s[i]!=s[already+1]) already=prefix[already];
if (s[i]==s[already+1]) already++;
prefix[i]=already;
perioada[i]=i;
if (perioada[already]==perioada[i-already])
{
perioada[i]=perioada[already];
sol=i;
}
}
return sol;
}
int main()
{
long int nteste,test,lung;
FILE *f=fopen("prefix.in","r");
FILE *g=fopen("prefix.out","w");
fscanf(f,"%ld",&nteste);
fgets(cuvant[0],MAXL+1,f);
for (test=1;test<=nteste;test++)
{
fgets(cuvant[test]+1,MAXL+1,f);
lung=det_lungime(cuvant[test]);
printf("%ld\n",lung);
//lung=strlen(cuvant[test]+1);
fprintf(g,"%ld\n",det_prefix(cuvant[test],lung-1));
}
fclose(f);
fclose(g);
getchar();
return 0;
}