SPOJ8222 字尾自動機

2021-08-29 23:22:05 字數 690 閱讀 2096

給出乙個字串,求這個字串長度為1-n的子串的最大出現次數

對於長度為x的子串的答案就是所有長度》=x的結點的right值的最大值

於是就從反向字尾樹的葉子開始,定義每個關鍵節點的right初始都為1,然後順著求出所有節點的子樹和就可以了

這裡用到了拓撲排序預處理 於是可以很方便的求出right陣列 或者寫bfs求也行 但是無腦寫幾個for明顯簡單得多

最後掃一遍更新答案就行了

#includeusing namespace std;

const int maxn=25e4+5;

char s[maxn];

int ans[maxn*2];

int n;

struct suffix_automation

int inline newnode()

void add(int c)}}

void work()

for(int i=cnt;i>=1;i--)

for(int i=1;i<=cnt;i++)

ans[l[i]]=max(ans[l[i]],right[i]);

for(int i=n-1;i>=1;i--)

ans[i]=max(ans[i],ans[i+1]);

}}sam;

int main()

SPOJ7258 SUBLEX 字尾自動機

題目鏈結 鏈結是洛谷有翻譯的鏈結。題意 給你乙個字串,有t次詢問,每次問你在整個字串中排名為k的子串是哪乙個。字串長度 90000,t 500,只統計本質不同的串。題解 字尾自動機題,因為字尾自動機有著很強的處理子串的能力。看到排名第k,我們可能會想到主席樹,但是顯然主席樹是沒法維護具體某個字串,但...

SPOJ 1811 LCS 字尾自動機

題意 求兩個串的最大連續子串 乙個串建sam,另乙個串在上面跑 注意如果走了suffix link,sum需要更新為t u val 1 suffix link有點像失配吧,當前狀態s走不了了就到suffix link指向的狀態fa上去,fa是s的字尾所以是可行的,並且有更多走的機會 include ...

SPOJ 1811 LCS 字尾自動機

題意 求兩個串的最大連續子串 乙個串建sam,另乙個串在上面跑 注意如果走了suffix link,sum需要更新為t u val 1 suffix link有點像失配吧,當前狀態s走不了了就到suffix link指向的狀態fa上去,fa是s的字尾所以是可行的,並且有更多走的機會 include ...