字串 字尾自動機SAM

2022-07-22 04:45:12 字數 839 閱讀 6697

#includeusing namespace std;

typedef long long ll;

const int maxn=1e6+50;

struct nodenode[maxn<<1];

int las=1,tot=1;

/*結點node表示乙個類

las是未加入此字元前的最長字首(==整個串)所屬的結點編號

tot是當前結點的總數

*/int siz[maxn<<1];

ll num;//num 存不同子串的數量

ll alllen;//所有不同子串的總長度

void add(int c)

}num+=node[np].len-node[node[np].fa].len;

alllen+=1ll*node[np].len*(node[np].len+1)/2-1ll*(node[node[np].fa].len)*(node[node[np].fa].len+1)/2;

}char s[maxn];int len;

//求出現次數最多的子串的次數********************************************

//begin1

int mx;//mx是子串出現次數的最大次數

vectorp[maxn<<1];

void dfsinit()

void dfs(int u)

}void query(int k)}}

puts("");

}//end3

int main()

getch(1,k);

}

字尾自動機SAM

原理詳細的可以看史上最通俗的字尾自動機詳解 想看懂還是要花很久。實現 include include using namespace std const int maxn 2000010 struct node nodes maxn int las 1 tot 1 char st maxn void...

SAM 字尾自動機

好文 luogup3804 定義.對給定字串s的字尾自動機是乙個最小化確定有限狀態自動機,它能夠接收字串s的所有字尾。對給定字串s的字尾自動機是乙個最小化確定有限狀態自動機,它能夠接收字串s的所有字尾。某一狀態t 0被稱作初始狀態,由它能夠到達其餘所有狀態。自動機中的所有轉移 即有向邊 都被某種符號...

SAM 字尾自動機

這玩意還真的好玄學,看了半天,也就看了個大概吧 確實很妙 總算理解了parent樹,但是關於sam的dag的性質的證明並沒有看太懂,也沒有特別明白。update 又看了一會,原來是自己把定義搞錯了,字尾自動機其實是在滿足以下條件的最簡狀態,主要是難構造,掌握構造 就好了,證明就不管了c。條件如下 摘...