Cod sursa(job #75185)

Utilizator thanhvyThanh Vy thanhvy Data 31 iulie 2007 05:34:12
Problema PScPld Scor 30
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.32 kb
{$INLINE ON}
program PScPld;

const
     inp  = 'pscpld.in';
     out  = 'pscpld.out';
     maxn = 1000001;

var
   a : array[0..maxn shl 1] of char;
   f : array[0..maxn shl 1] of longint; // f[i] la max odd palindrome co tam tai i
   rec, p, tmp, ans, n, i, p1, p2 : longint;

function min(a, b : longint) : longint; inline;
         begin
              if a < b then min := a else min := b;
         end;

BEGIN
     assign(input, inp);        reset(input);
     assign(output, out);       rewrite(output);
     FillChar(a, sizeof(a), '.');
     n := -1;
     while not EOLN do begin
           n += 2;
           read(a[n]);
     end;
     n += 1;

     rec := 0;
     p := -1;
     ans := 0;
     for i := 0 to n do begin
         if i <= p then
            f[i] := min(f[rec shl 1 - i], p - i)
         else
             f[i] := 0;

         while (i - f[i] - 1 >= 0) and (i + f[i] + 1 <= n) do begin
               p1 := i - f[i] - 1;
               p2 := i + f[i] + 1;
               if a[p1] <> a[p2] then break;
               f[i] += 1;
         end;

         tmp := i + f[i];
         if i > rec then begin
            p := tmp;
            rec := i;
         end;

         ans += (f[i] + 1) shr 1;
     end;
     writeln(ans);
     close(input);              close(output);
END.