回文自动机

var n:longint;
    nt:array[0..200008,0..26] of longint;
    size,l,fa:array[0..200008] of longint;
    s:array[0..200008] of char;
    cnt,last:longint;
procedure init;
begin
    fa[0]:=1;
    fa[1]:=1;
    l[1]:=-1;
    last:=0;
    cnt:=1;
end;
procedure add(c,n:longint);
var p,now,k:longint;
begin
    p:=last;
    while s[n-l[p]-1]<>s[n] do p:=fa[p];
    if nt[p][c]=0 then
    begin
        inc(cnt); now:=cnt; k:=fa[p];
        l[now]:=l[p]+2;
        while s[n-l[k]-1]<>s[n] do k:=fa[k];
        fa[now]:=nt[k][c]; nt[p][c]:=now;
    end;
    last:=nt[p][c];
    inc(size[last]);
end;
procedure solve;
var i:longint;
begin
    for i:=cnt downto 1 do
    begin
        inc(size[fa[i]],size[i]);
        writeln(size[i],' ',l[i]);
    end;
end;
begin
    n:=0;
    init;
    while not eoln do
    begin
        inc(n);
        read(s[n]);
        add(ord(s[n])-96,n);
    end;
    solve;
end.
原文地址:https://www.cnblogs.com/rpSebastian/p/4638327.html