1 struct SAM{ 2 int ch[maxn][26],fa[maxn],len[maxn],cnt,last; 3 void Init() 4 { 5 memset(ch,0,sizeof(ch)); 6 memset(fa,0,sizeof(fa)); 7 last=cnt=1; 8 } 9 void Add(int c) 10 { 11 int p=last,np=last=++cnt; 12 len[np]=len[p]+1; 13 while(!ch[p][c]&&p){ 14 ch[p][c]=np;p=fa[p]; 15 } 16 if(p==0) 17 fa[np]=1; 18 else{ 19 int q=ch[p][c]; 20 if(len[p]==len[q]-1){ 21 fa[np]=q; 22 } 23 else{ 24 int nq=++cnt;len[nq]=len[p]+1; 25 memcpy(ch[nq],ch[q],sizeof(ch[q])); 26 fa[nq]=fa[q];fa[q]=fa[np]=nq; 27 while(ch[p][c]==q&&p){ 28 ch[p][c]=nq; 29 p=fa[p]; 30 } 31 } 32 } 33 } 34 };
时间: 2024-11-05 12:29:46