spoj LCS 【后缀自动机】
2016-07-13 19:58
253 查看
琦不会后缀自动机……
是以前太浪了……
所以所有东西都留到了noi前来学……
马上狗牌退役了TAT(心塞qwq
题目大意:给出两个串A,B,求A、B的最长公共子串
对A建后缀自动机,然后用B去匹配,若能匹配上就转移到儿子,否则沿着parent树向上跳
是以前太浪了……
所以所有东西都留到了noi前来学……
马上狗牌退役了TAT(心塞qwq
题目大意:给出两个串A,B,求A、B的最长公共子串
对A建后缀自动机,然后用B去匹配,若能匹配上就转移到儿子,否则沿着parent树向上跳
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #define N 500005 using namespace std; int n,m,last = 1,tot = 1,p,q,np,nq,ans; int son [26],par ,mx ; char a ,b ; int new_node(int x) { mx[++ tot] = x; return tot; } void add(int x) { p = last; np = new_node(mx[p] + 1); for (;p && !son[p][x];p = par[p]) son[p][x] = np; if (!p) par[np] = 1; else { q = son[p][x]; if (mx[q] == mx[p] + 1) par[np] = q; else { nq = new_node(mx[p] + 1); memcpy(son[nq],son[q],sizeof(son[nq])); par[nq] = par[q],par[q] = par[np] = nq; for (;son[p][x] == q;p = par[p]) son[p][x] = nq; } } last = np; } int main() { scanf("%s%s",a + 1,b + 1); n = strlen(a + 1),m = strlen(b + 1); for (int i = 1;i <= n;i ++) add(a[i] - 'a'); for (int i = 1,p = 1,l = 0;i <= m;i ++) { int x = b[i] - 'a'; if (son[p][x]) l ++,p = son[p][x]; else { for (;p && !son[p][x];p = par[p]); if (!p) l = 0,p = 1; else l = mx[p] + 1,p = son[p][x]; } ans = max(ans,l); } cout << ans << endl; return 0; }
相关文章推荐
- 调用C++11编译器 //支持c++11
- Cocos2d-x 综述——API 风格
- 浅谈JSON
- Spring MVC中前后台数据传输小结
- python正则表达式
- springMVC基础
- Oculus Rift, HTC Vive, SONY PSVR的全面对比
- C语言的回调函数
- node 单线程异步非阻塞
- HDU 今年暑假不AC
- node 单线程异步非阻塞
- 掌握这两个技术点,你可以玩转AppCan前端开发
- 使用Django的models创建mysql数据库
- iOS学习之加载storyboard和xib文件
- __builtin_return_address(LEVEL)函数解释
- 我的小车-RUNNER
- 触发器:实际工作中创建脚本时用到的
- 算法资料
- Android中常用的一些命令
- SPOJ DETER3 Find The Determinant III(求行列式的秩、高斯消元)