LCS2 - Longest Common Substring II

no tags 

A string is finite sequence of characters over a non-empty finite set Σ.

In this problem, Σ is the set of lowercase letters.

Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string.

Now your task is a bit harder, for some given strings, find the length of the longest common substring of them.

Here common substring means a substring of two or more strings.

Input

The input contains at most 10 lines, each line consists of no more than 100000 lowercase letters, representing a string.

Output

The length of the longest common substring. If such string doesn't exist, print "0" instead.

Example

Input:
alsdfkjfjkdsal
fdjskalajfkdsla
aaaajfaaaa Output:
2

Notice: new testcases added

题意:

  求多个串的最长公共字串

题解:

  将第一个串建立后缀自动机

  根据拓扑排序更新每个状态节点下所能向前延伸的长度,每次匹配一个串都更新即可

  是不是很模糊

#include <bits/stdc++.h>
inline long long read(){long long x=,f=;char ch=getchar();while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}return x*f;}
using namespace std; const int N = 3e5+; const long long mod = ; int isPlus[N * ],endpos[N * ];int d[N * ];
int tot,slink[*N],trans[*N][],minlen[*N],maxlen[*N],pre;
int newstate(int _maxlen,int _minlen,int* _trans,int _slink){
maxlen[++tot]=_maxlen;minlen[tot]=_minlen;
slink[tot]=_slink;
if(_trans)for(int i=;i<;i++)trans[tot][i]=_trans[i],d[_trans[i]]+=;
return tot;
}
int add_char(char ch,int u){
int c=ch-'a',v=u;
int z=newstate(maxlen[u]+,-,NULL,);
isPlus[z] = ;
while(v&&!trans[v][c]){trans[v][c]=z;d[z]+=;v=slink[v];}
if(!v){ minlen[z]=;slink[z]=;return z;}
int x=trans[v][c];
if(maxlen[v]+==maxlen[x]){slink[z]=x;minlen[z]=maxlen[x]+;return z;}
int y=newstate(maxlen[v]+,-,trans[x],slink[x]);
slink[z]=slink[x]=y;minlen[x]=minlen[z]=maxlen[y]+;
while(v&&trans[v][c]==x){trans[v][c]=y;d[x]--,d[y]++;v=slink[v];}
minlen[y]=maxlen[slink[y]]+;
return z;
}
void init_sam() {
for(int i = ; i <= tot; ++i)
for(int j = ; j < ; ++j) trans[i][j] = ;
pre = tot = ;
} int dp[N],ans,n,vis[N],cnt[N],pos[N];
char a[N];
int main() {
int f = ;
while(scanf("%s",a)!=EOF) {
n = strlen(a);
if(f) {
init_sam();
for(int i = ; i < n; ++i)
pre = add_char(a[i],pre);
f = ;
for(int i = ; i <= n; ++i)cnt[i] = ;
for(int i = ; i <= tot; ++i)cnt[maxlen[i]] += ;
for(int i = ; i <= n; ++i)cnt[i]+=cnt[i-];
for(int i = tot; i >= ; --i)pos[cnt[maxlen[i]]--] = i;
}
else
{
int now = ,sum = ;
for(int i = ; i < n; ++i)
{
if(trans[now][a[i]-'a']) {
sum++;
now = trans[now][a[i]-'a'];
dp[now] = max(dp[now],sum);
}
else {
while(now) {
now = slink[now];
if(trans[now][a[i]-'a']) break;
}
if(!now) now = ,sum = ;
else
{
sum = maxlen[now] + ;
now = trans[now][a[i]-'a'];
dp[now] = max(dp[now],sum);
}
}
}
for(int i = tot; i >= ; --i) {
int v = pos[i];
maxlen[v] = min(maxlen[v],dp[v]);
dp[slink[v]] = max(dp[slink[v]],dp[v]);
dp[v] = ;
}
}
}
int ans = ;
for(int i = ; i <= tot; ++i) {
ans = max(ans,maxlen[i]);
}
printf("%d\n",ans);
return ;
}
/*
aabbcd
babbefg
cdbbabb
*/

最新文章

  1. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
  2. jQuery之元素的遍历与元素的过滤
  3. android基础(五)网络数据解析方法
  4. 通过BroadCast与service时时监听网络变化
  5. Oracle11gR2用EXP导出时报EXP-00011错误的解决
  6. 笔记13:File 类的一些操作
  7. 8.1搜索专练DFS和BFS
  8. 内存管理和@property的属性
  9. The first time
  10. Linq to Sql语法及实例大全
  11. UESTC 30 &amp;&amp;HDU 2544最短路【Floyd求解裸题】
  12. 安装oracle后登录时出现 ERROR: ORA-01031 insufficient privileges
  13. TCP和UDP的最完整的区别
  14. iOS中 自定义系统相机 作者:韩俊强
  15. winform 实现类似于TrackBar的自定义滑动条,功能更全
  16. 第十二课 CSS基本选择器 css学习2
  17. Lodop打印如何隐藏table某一列
  18. 手机上的m3u8视频(缓存)怎么转成MP4?
  19. 如何用ModelsimSE仿真IP核-以PLL为例
  20. tensorflow 笔记8:RNN、Lstm源码,训练代码输入输出,维度分析

热门文章

  1. json.net(Json.NET - Newtonsoft)利用动态类解析json字符串
  2. 交换机的MAC地址作用
  3. 第十二届北航程序设计竞赛决赛网络同步赛 J题 两点之间
  4. GRDB自定义的纯函数
  5. TIDB 安装
  6. Zlib编译
  7. 【java】安全加密MessageDigest的功能及用法【hash一致性算法】
  8. Ubuntu免安装配置MySQL
  9. 【GLSL教程】(六)逐顶点的光照 【转】
  10. centos 7 安装五笔输入法