用后缀自动机求两个长串的最长公共子串,效果拔群。多样例的时候memset要去掉。

解题思路就是跟CLJ的一模一样啦。

#pragma warning(disable:4996)
#include<cstring>
#include<string>
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
#define maxn 250050
using namespace std;struct State{State *suf, *go[26];int val;State() :suf(0), val(0){memset(go, 0, sizeof(go));}
}*root, *last;State statePool[maxn * 2], *cur;void init()
{cur = statePool;root = last = cur++;
}void extend(int w)
{State *p = last, *np = cur++;np->val = p->val + 1;while (p&&!p->go[w]) p->go[w] = np, p = p->suf;if (!p) np->suf = root;else{State *q = p->go[w];if (p->val + 1 == q->val){np->suf = q;}else{State *nq = cur++;memcpy(nq->go, q->go, sizeof q->go);nq->val = p->val + 1;nq->suf = q->suf;q->suf = nq;np->suf = nq;while (p&&p->go[w] == q){p->go[w] = nq, p = p->suf;}}}last = np;
}char stra[maxn], strb[maxn];int main()
{while (~scanf("%s%s", stra, strb)){init();//memset(statePool, 0, sizeof(statePool));int lena = strlen(stra);for (int i = 0; i < lena; i++){extend(stra[i] - 'a');}int ans = 0;int lenb = strlen(strb);State *p = root;int len = 0;for (int i = 0; i < lenb; i++){if (p->go[strb[i] - 'a']){len++; ans = max(ans, len);p = p->go[strb[i] - 'a'];}else{while (p&&!p->go[strb[i] - 'a']){p = p->suf;}if (!p) {p = root;len = 0;}else{len = p->val + 1;ans = max(len, ans);p = p->go[strb[i] - 'a'];}}}printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/chanme/p/3551560.html

SPOJ LCS 后缀自动机相关推荐

  1. spoj 1811 LCS 后缀自动机

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  2. SPOJ NSUBSTR(后缀自动机)

    题目链接:http://www.spoj.com/problems/NSUBSTR/ 题目大意:给你一个字符串s(len(s)<=250000),求f[i](i=1...len(s)),其中f[ ...

  3. SPOJ 7258 (后缀自动机)

    转载:http://hzwer.com/4492.html 给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 搞出后缀自动机 dp处理出每个点往下走能 ...

  4. SPOJ 1811 LCS [后缀自动机]

    题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...

  5. 【后缀自动机】SPOJ 1812-LCSII

    题意: 给出最多10个长度不超过100000的字符串,求他们的LCS的长度.时限是鬼畜的0.25s . 后缀自动机练习...虽然有人这么说但我并不觉得hash能过. 本题可以说是[论SAM中按step ...

  6. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  7. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  8. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)

    手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...

  9. 2021ICPC(澳门) - LCS Spanning Tree(广义后缀自动机)

    题目链接:点击查看 题目大意:给出一个含有 nnn 个点的无向图,点权为一个字符串,每条边的边权为相邻两点的 LCSLCSLCS,本题的 LCSLCSLCS 定义为两个字符串的最长公共子串的长度 求出 ...

最新文章

  1. 什么是生成模型和GAN?一文体验计算机视觉的魔力
  2. 分布式服务化系统一致性的“最佳实干”
  3. git的团队协作开发
  4. 第10章 例题 7-3 递归实现逆序输出整数
  5. 有网友提问,关于本地XML转JSON的小工具
  6. Nginx网站用户认证
  7. angular日期输入框html,html5 – Angular2:日期格式文本框ngModel不起作用
  8. 递归,复制对象,找质数,判断数组
  9. 【Machine Learning 二】单变量线性回归,代价函数,梯度下降
  10. 怎么计算z=x+y的概率密度_上大《Scripta Mater》基于第一性原理计算,研究镁合金强化相!...
  11. 连续语音识别,continuous speech recognition,音标,读音,翻译,英文例句,英语词典
  12. 【收藏推荐】Markdown常用LaTeX数学符号公式
  13. 记一次勒索病毒下的Oracle数据恢复
  14. [2019/12]饮水姑苏,止于至善
  15. android手机如何访问电脑tomcat服务器
  16. pt100+51单片机的温控系统程序+仿真图 还带压力显示的
  17. 优秀的项目经理是如何进行项目管理的
  18. Nodejs和ajax不同,Nodejs和AJAX的区别是什么?
  19. android虚拟按键keycode,安卓虚拟按键 键码
  20. 美拍爬虫逆向js解析实战

热门文章

  1. linux内核优化项,Linux内核优化配置
  2. SkyEye卫星篇:从无到有的国之“芯”
  3. Linux 安装 MySQL 数据库
  4. 全志t3linux驱动_全志A20GPIO驱动分析|Android驱动及系统开发交流区|研发交流|雨滴科技技术论坛 - Powered by Discuz!...
  5. (213)initial是否可综合?
  6. python实现特定软件代理_Python针对特定服务定制的代理工具V2.0------(proxyHandler.py)...
  7. 9.FreeRTOS学习笔记-任务通知
  8. java锁包读写锁_Java并发包7--读写锁ReentrantReadWriteLock的实现原理解析
  9. Linux-3.2.0.24中内核的Netlink测试使用
  10. 苹果11如何设置9宫格_iphone九宫格如何设置 iphone九宫格设置方法【详解】