和上个题目差不多,这次是找若干个串的LCS,若干<=10 。

做法上面也是类似的。

首先以第一个建立SAM,然后后面的串都在上面更新。每个串的更新是独立进行的,互不影响。对于同一状态,首先在同一个串的更新中取最大值,然后再不同的串之间取最小值,最后统计一下所有状态的最大值就可以了。

与上面不同的是,多了一个小小的操作,对于某一个状态存在一个匹配长度x,那么在该状态上所有的pre指针所指向的状态的的匹配长度都肯定会是step值。

一开始我也不理解为什么,后来发现后缀自动机的性质啦嘿嘿,(想一想就知道咯)。

但是为什么不更新pre指针会错呢?其实是这样的,每次加入一个字符匹配,当前只可能在一个状态,但是其实pre指针所有的位置都是可以进行匹配的。而且由于串很多,所有后面的串不一定都更新在这个状态,虽然他们的right位置是一样的。。(嗯,好像很有道理)

为什么上一个题目lcs没有对pre指针进行更新却依然正确呢?原因是不需要,对于每个状态step相当于与第一个模式串比配的最大长度,注意是最大,所以在第二个字符串来匹配的时候,当前状态的长度就是两个串在该状态的最大公共长度了。同时,在该状态的所有pre状态也肯定会存在匹配长复,但是那些肯定都不会优于这个状态,所以这个更新是不必要的,而对于多个串,由于每个串在可能分别落在不同的pre指针上,所以需要跟新一遍咯。

召唤代码君:

#include <iostream>
#include <cstdio>
#define maxn 200100
using namespace std; int next[maxn][26],pre[maxn],step[maxn];
int f[13][maxn];
int N=0,last=0,n=1;
int p,q,np,nq;
char s[13][maxn]; void insert(int x,int m)
{
np=++N,p=last,step[np]=m;
while (p!=-1 && next[p][x]==0) next[p][x]=np,p=pre[p];
last=np;
if (p==-1) return;
q=next[p][x];
if (step[q]==step[p]+1) { pre[np]=q; return ; }
nq=++N,step[nq]=step[p]+1,pre[nq]=pre[q];
for (int i=0; i<26; i++) next[nq][i]=next[q][i];
pre[np]=pre[q]=nq;
for (; p!=-1 && next[p][x]==q;p=pre[p]) next[p][x]=nq;
} void dp(int x)
{
int cur=0,tmp=0;
for (int i=0; s[x][i]; i++)
{
int k=s[x][i]-'a';
while (next[cur][k]==0 && cur!=0) cur=pre[cur];
tmp=min(step[cur],tmp);
cur=next[cur][k];
if (cur) tmp++;
f[x][cur]=max(f[x][cur],tmp);
}
for (int i=N; i>0; i--)
if (f[x][i])
for (int j=pre[i];j && f[x][j]!=step[j];j=pre[j]) f[x][j]=step[j];
} int main()
{
pre[0]=-1;
while (scanf("%s",s[n])!=EOF) n++; n--;
for (int i=0; s[1][i]; i++) insert(s[1][i]-'a',i+1);
for (int i=2; i<=n; i++) dp(i);
int ans=0;
for (int i=1; i<=N; i++)
{
int tmp=step[i];
for (int j=2; j<=n; j++) tmp=min(tmp,f[j][i]);
ans=max(ans,tmp);
}
printf("%d\n",ans);
return 0;
}

  

SPOJ_LCS2的更多相关文章

随机推荐

  1. Git的原理简介和常用命令

    Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调 ...

  2. Object C学习笔记10-静态方法和静态属性

    在.NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此.在Object C中也存在static关键字,今天的学 ...

  3. appium 遇到的坑

    上周开始试着来用appium,首先开始去官网看,然后下载appium客户端,下载安装后,然后笔者开始安装android sdk   ,进官网下载后,笔者下载安装后,在更新下载SDK Manager的时 ...

  4. monkey测试入门2--测试步骤、常用参数、常规monkey命令

    <凤栖梧> 柳永 伫倚危楼风细细,望极春愁,黯然生天际.草色烟光残照里,无言谁会凭栏意? 拟把疏狂图一醉,对酒当歌,强乐还无味,衣带渐宽终不悔,为伊消得人憔悴. 简要步骤:adb devi ...

  5. 解决Unity烘焙阴影锯齿精度不足的问题

    烘焙阴影锯齿问题  烘焙后阴影锯齿明显,如下图: 烘焙的光照贴图质量主要受LightmapParameters 的Blur Radius和抗锯齿级别影响, 默认最高级别如下: 如果最高级别不能达到好的 ...

  6. 1.0 JAVA基础核心概念

    JAVA基础知识 转载至:http://www.runoob.com/java/java-variable-types.html 对菜鸟教程进行核心整理: 一.JAVA理论概念 1.基础概念 Java ...

  7. docker 部署 zookeeper+kafka 集群

    主机三台172.16.100.61172.16.100.62172.16.100.63Docker 版本 当前最新版 # 部署zk有2种方法 ## 注意 \后不要跟空格 一 . 端口映射 172.16 ...

  8. Django FBV/CBV、中间件、GIT使用

    s5day82 内容回顾: 1. Http请求本质 Django程序:socket服务端 a. 服务端监听IP和端口 c. 接受请求 \r\n\r\n:请求头和请求体 \r\n & reque ...

  9. [T-ARA][느낌 아니까][懂得那份感觉]

    歌词来源:http://music.163.com/#/song?id=27808771 作曲 : 박덕상/박현중 [作曲 : p/bag-ddeog-ssang-/p/ba-Kyeon-c/jung ...

  10. iOS软件"一天八杯水“app开发过程

    作为一个ios系统测试者和app外观设计者.我们首先要了解iOS系统的开发工具和资源.xcode和iOS sdk作为一个免费的开发环境值得我们去学习和了解.interface builder提供创建了 ...