SPOJ LCS2 多个串的最长公共子串
2015-06-19 02:01
417 查看
这里串最多有10个,找所有串的最长公共子串
这里后缀自动机做,以第一个串建立后缀自动机,后面的串一个个去匹配,每次得到当前串在可到达状态上所能得到的最长后缀长度
拿所有串匹配后得到的结果进行计算
这里后缀自动机做,以第一个串建立后缀自动机,后面的串一个个去匹配,每次得到当前串在可到达状态上所能得到的最长后缀长度
拿所有串匹配后得到的结果进行计算
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define M 26 #define N 200100 char str ; struct SamNode{ SamNode *son[M] , *f; int l , nc , c; }sam , *last , *root , *b ; int cnt , num ; void init() { root = last = &sam[cnt=0]; } void add(int x) { SamNode *p = &sam[++cnt] , *jp=last; p->l = jp->l+1 , p->nc = p->l; last = p; for( ; jp&&!jp->son[x] ; jp=jp->f) jp->son[x]=p; if(!jp) p->f = root; else{ if(jp->l+1 == jp->son[x]->l) p->f = jp->son[x]; else{ SamNode *r = &sam[++cnt] , *q = jp->son[x]; *r = *q; r->l = r->nc = jp->l+1; q->f = p->f = r; for( ; jp && jp->son[x]==q ; jp=jp->f) jp->son[x]=r; } } } void solve() { int len = strlen(str) , ret; for(int i=0 ; i<=cnt ; i++) num[sam[i].l]++; for(int i=1 ; i<=len ; i++) num[i]+=num[i-1]; for(int i=0 ; i<=cnt ; i++) b[--num[sam[i].l]] = &sam[i]; while(~scanf("%s" , str)){ len = strlen(str) , ret=0; SamNode *cur = root; for(int i=0 ; i<len ; i++){ int x = str[i]-'a'; if(cur->son[x]){ ret++; cur = cur->son[x]; } else{ while(cur && !cur->son[x]) cur = cur->f; if(!cur){ cur = root; ret = 0; }else{ ret = cur->l+1; cur = cur->son[x]; } } cur->c = max(cur->c , ret); } for(int i=cnt ; i>0 ; i--){ b[i]->nc = min(b[i]->nc , b[i]->c); //子节点可接受到的后缀父节点必定能够接收到,反之却不一定 b[i]->f->c = max(b[i]->f->c , b[i]->c); b[i]->c = 0; } } } int main() { // freopen("a.in" , "r" , stdin); scanf("%s" , str); init(); int len = (int)strlen(str); for(int i=0 ; i<len ; i++) add(str[i]-'a'); solve(); int ret = 0; SamNode *cur; for(int i=1 ; i<=cnt ; i++){ cur = &sam[i]; ret = max(cur->nc , ret); } printf("%d\n" , ret); return 0; }
相关文章推荐
- fiddler移动端抓包
- 第五章:浏览器的嗅探和特征侦测
- SIOCADDRT: No such process
- 【TypeScript】TypeScript 学习 2——接口
- 成为高级程序员的 10 个步骤
- 轻松修改网站名---轻开电子商务系统(企业入门级B2C网站)
- bash字符串处理
- 黑马程序员——Java基础(数组)
- Java串口通信
- 网页基本常用标签
- C#中委托和代理的深刻理解(转载)
- Haproxy+keepalived实现双主负载均衡高可用集群 推荐
- 轻松记忆所谓“大小端”
- jquery 页面滚动到底部自动加载插件集合
- 使用“结构”统计学生成绩
- 2015届华为校园招聘机试题<二>
- JAVA基础第三天,eclipse软件的应用和if语句的编写(15-6-18)
- hdu 1247 Hat’s Words
- 一个简单的排序,练练手
- lvs+keepalived高可用负载均衡集群双主实现