博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多个串的最长公共子串 SPOJ - LCS2 后缀自动机
阅读量:5030 次
发布时间:2019-06-12

本文共 2244 字,大约阅读时间需要 7 分钟。

题意:

求多个串的最长公共子串

这里用的是O(n)的后缀自动机写法

我后缀数组的专题有nlog(n)写法的

 

题解:

对于其中的一个串建立后缀自动机

然后对于后缀自动机上面的每一个节点求出每一个节点最长可以匹配的子串(用maxx【】数组存下)

但是在后缀自动机上面有些节点没有走过,但是是某些走过的点的父亲节点因此也是有值的

for (int i = tot; i; i--)     maxx[fail[i]] = max(maxx[fail[i]], min(len[fail[i]], maxx[i])); 然后求一个所有最小值里面的最大值就好了
1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 15 #define pi acos(-1.0) 16 #define eps 1e-9 17 #define fi first 18 #define se second 19 #define rtl rt<<1 20 #define rtr rt<<1|1 21 #define bug printf("******\n") 22 #define mem(a, b) memset(a,b,sizeof(a)) 23 #define name2str(x) #x 24 #define fuck(x) cout<<#x" = "<
<
maxx[i]) minn[i] = maxx[i];105 }106 107 } sam;108 109 110 int main() {111 #ifndef ONLINE_JUDGE112 FIN;113 #endif114 sfs(s);115 int n = strlen(s);116 sam.init();117 for (int i = 0; i < n; ++i) sam.extend((s[i] - 'a'));118 for (int i = 0; i <= sam.tot; i++) sam.minn[i] = -1;119 while (~sfs(s)) sam.match();120 int ans = 0;121 for (int i = 1; i <= sam.tot; i++) ans = max(ans, sam.minn[i]);122 printf("%d\n", ans);123 #ifndef ONLINE_JUDGE124 cout << "Totle Time : " << (double) clock() / CLOCKS_PER_SEC << "s" << endl;125 #endif126 return 0;127 }
View Code

 

 

转载于:https://www.cnblogs.com/qldabiaoge/p/11545062.html

你可能感兴趣的文章
WPF 3D变换应用
查看>>
luogu4012 深海机器人问题 网络流
查看>>
android 拍照上传照片
查看>>
ArchLinux安装开源VMware Tools
查看>>
系统用户分析模型
查看>>
DB2 锁升级示例1
查看>>
16.RDD实战
查看>>
MainFrame知识小结(20120210)—dfsort/syncsort中的数据类型
查看>>
jsp题库 (一)小测(25/21)
查看>>
D - Flip tile
查看>>
Java连接RabbitMQ之创建连接
查看>>
开户vim编程之--cscope支持
查看>>
python数据类型图解
查看>>
js获取标准北京时间
查看>>
DZ!NT论坛 3.6.711删除用户各种错解决方案
查看>>
C#微信登录-手机网站APP应用
查看>>
HTML5实践 -- iPhone Safari Viewport Scaling Bug
查看>>
一位数据挖掘成功人士 给 数据挖掘在读研究生 的建议
查看>>
Python3.6.0安装
查看>>
hdu1049
查看>>