#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。條件如下 摘...