后缀自动机模板(SPOJ1811)
2016-12-15 12:02
435 查看
用后缀自动机实现求两个串的最长公共子串。
#include <cstdio> #include <algorithm> const int N = 500005; char s ; int sz,sm,lst,ans,l ,f ,ch [26]; int main() { scanf("%s", s); for(int i = 0; s[i]; i++) { int c = s[i]-'a', u = lst; for(lst = ++sz, l[sz] = i+1; u && !ch[u][c]; u = f[u]) ch[u][c] = sz; int x = ch[u][c]; if(!x) {ch[u][c] = sz; continue;} if(l[u]+1 == l[x]) {f[sz] = x; continue;} l[++sz] = l[u]+1, f[sz] = f[x], f[x] = f[lst] = sz; for(int j = 0; j < 26; j++) ch[sz][j] = ch[x][j]; for(; u && ch[u][c] == x; u = f[u]) ch[u][c] = sz; if(ch[u][c] == x) ch[u][c] = sz; } scanf("%s", s); for(int i = 0, u = 0; s[i]; i++) { int c = s[i]-'a'; for(; u && !ch[u][c]; sm=l[u=f[u]]); if(ch[u][c]) sm++, u = ch[u][c]; ans = std::max(ans, sm); } printf("%d", ans); return 0; }
相关文章推荐
- 后缀自动机模板 洛谷p3804
- [后缀自动机 模板题] SPOJ 1811 Longest Common Substring
- 后缀自动机(SAM)模板
- hdu4622 后缀自动机 模板
- SPOJ 8222. Substrings(后缀自动机模板)
- [后缀自动机 模板题] SPOJ 1812 Longest Common Substring II & BZOJ 2946 [Poi2000]公共串
- 后缀自动机模板 SAM
- Sam后缀自动机模板
- 后缀自动机模板
- [后缀自动机 模板题] SPOJ 8222 Substrings
- SPOJ 8222. Substrings(后缀自动机模板)
- [最小循环表示 后缀自动机 模板题] BZOJ 2882 工艺
- [后缀自动机 模板题 || 字符串Hash] HDU 4622 Reincarnation
- SPOJ1811最长公共子串问题(后缀自动机)
- P3804 [模板]后缀自动机
- 洛谷P3804 - 【模板】后缀自动机
- [K大子串 后缀自动机 模板题] BZOJ 3998 [TJOI2015]弦论
- spoj1811 Longest Common Substring(LCS),后缀自动机
- SAM(后缀自动机)模板
- 【Luogu3804】【模板】后缀自动机(后缀自动机)