Cod sursa(job #186560)

Utilizator dobreDobre Catalin Andrei dobre Data 28 aprilie 2008 12:28:08
Problema Prefix Scor 80
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.29 kb
{9:05}
program prefix;
const fi='prefix.in';fo='prefix.out';
var pi:array[1..1000000]of longint;
    a:array[1..1000000]of char;
    f,g:text;
    i,t:longint;
    leng:longint;
function cautare_binara(x,y:longint):longint;
var mij:longint;
begin
if x=y then begin
     leng:=x;
     exit;
   end
   else begin
         mij:=(x+y)div 2;
         if ord(a[mij])=32 then cautare_binara(x,mij)
            else cautare_binara(mij+1,y);
        end;
end;
function merge(leng,i:longint):boolean;
var ok:boolean;
begin
if i mod leng=0 then ok:=true
   else ok:=false;
merge:=ok;
end;

function calc_pref(n:longint):longint;
var k,q,sol:longint;
    i:longint;
    leng:longint;
begin
fillchar(pi,sizeof(pi),0);
k:=0;
pi[1]:=0;sol:=0;leng:=0;
for i:=2 to n do begin
     while(k>0)and(a[k+1]<>a[i])do k:=pi[k];
     if a[k+1]=a[i] then inc(k);
     pi[i]:=k;
     if(k>0)and(merge(i-pi[i],i)) then sol:=i;
    end;
calc_pref:=sol;
end;

begin
assign(f,fi);reset(f);
assign(g,fo);rewrite(g);
readln(f,T);
for i:=1 to T do begin
     fillchar(a,sizeof(a),' ');
     readln(f,a);
{     while ord(a[j])<>0 do j:=j+1;
     dec(j);}
     cautare_binara(1,1000000);
     if ord(a[leng])=32 then dec(leng,2);
     writeln(g,calc_pref(leng));
    end;
close(g);
closE(f);
end.