演算法模板 字尾自動機模板

2021-08-22 14:48:29 字數 1998 閱讀 5677

pascal字尾自動機模板 

//字尾自動機模板

var i,last,q,p,total,x,cur,clo:longint;

s:ansistring;

n:int64;

bz:boolean;

len,link:array[0..150000]of longint; //len——節點i到0的最短路,link——狀態i的(**?)

son:array[0..150000,1..52]of longint; //節點i的兒子

begin

assign(input,'sf_suffixautomaton_template.in');reset(input);

assign(output,'sf_suffixautomaton_template.out');rewrite(output);

readln(s);

readln(n);

last:=0;

for i:=1 to length(s) do

begin

if s[i]<='z'then x:=ord(s[i])-64

else x:=ord(s[i])-70; //字元轉ascall碼

inc(total);

cur:=total;

p:=last;

len[cur]:=len[last]+1; //新建節點cur,因其位置在字尾自動機中儲存的原串上,所以len[cur]

//永遠為上乙個cur(即last)的len+1

bz:=false;

while son[p,x]=0 do //p是否有值為x的邊

begin

if (p=0)and(son[p,x]=0) then

begin

son[p,x]:=cur; //走到link鏈的底部,無法再走了,所以將連完邊後將link[cur]賦為0

link[cur]:=p;

break;

end;

son[p,x]:=total; //沒邊,便給p向cur連上一條值為x的邊

p:=link[p]; //走link鏈

if son[p,x]<>0 then bz:=true; //說明新的p節點有這條邊了,退出,打標記是為了保證連完邊

//退出後不會誤判

end;

if (p=0)and(son[p,x]=0) then //迷之bug導致bz變為了true,於是多判一次

begin

son[p,x]:=cur;

link[cur]:=p;

bz:=false;

end;

if bz=true then

begin

q:=son[p,x];

if len[q]=len[p]+1 then link[cur]:=q //如果已有兒子len值合法則更新link[cur]

else

begin

inc(total); //否則轉殖乙個節點,其link值與son均與已有兒子相同

clo:=total;

link[clo]:=link[q];

son[clo]:=son[q];

len[clo]:=len[p]+1; //但其len等於len[p]+1

link[q]:=clo; //將cur和q的link值改為clo

link[cur]:=clo;

while (son[p,x]=q)do //將p的link鏈上(包括p點)的,連出的x邊兒子為q的點的兒子更改為clo

begin

son[p,x]:=clo;

if p=0 then break;

p:=link[p];

end;

end;

end;

last:=cur; //更新last

end;

close(input);

close(output);

end.

字尾自動機模板

include include define maxc 28 using namespace std const int maxn 1e6 5 const int mod 1e9 7 typedef long long ll int len maxn 2 最長子串的長度 該節點字串數量 len x ...

模板 字尾自動機

求子串的出現次數。用類似拓撲排序的思想,從沒有出度的節點開始把他的cnt加在他的字尾連線上。include using namespace std typedef long long ll struct node void copynewnode const int l,const node n c...

模板 字尾陣列 字尾自動機

關於字尾自動機sam,貼乙個非常好的講解 字尾自動機學習小記 交洛谷模板可a 傳送門 洛谷 模板 字尾排序 include using namespace std const int n 1e6 5 char s n int sa n t1 n t2 n c n int n,m 555 void s...