题意:

求多个字符串的最长公共子串

思路:

4000个串,200长度。

一种暴力,对于一个串最多有200*200=40000级别个子串,然后我要再处理一下next数组200,8e6复杂度;

然后我要和4000个串去匹配一下,看看符不符合,400000*4000*200这样就炸了;

其实显然不需要所有的子串都枚举出来,可以二分来搞,因为显然如果有aaaa为最长公共字串,则aaa则一定有。

然后参考了一篇博文,用KMP,是利用其快速求最长前缀,所以只需要枚举开头即最多200/2=100次。复杂度才O(4000*100)

这份代码的GetlongestPre函数中,逐渐缩短模式串也有贪心的意思。

看自己理解吧。

//#include<bits/stdc++.h>
//using namespace std;
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int N=4e3+10;
const int M=2e2+10; char wxy[N][M];
int next[M],n; void GetNext(char *s,int len)
{
int i,j;
next[0]=-1;
i=0;
j=-1;
while(i<len)
{
if(j==-1||s[i]==s[j])
next[++i]=++j;
else
j=next[j];
}
} int GetLongestPre(char *s,int len)
{
GetNext(s,len);
for(int i=1; i<n; i++)
{
char *p=wxy[i];
int j=0,tmp=0;
while(*p&&j<len)
{
if(j==-1||*p==s[j])
{
p++;
j++;
tmp=max(tmp,j);
}
else
j=next[j];
}
len=tmp;
}
return len;
} int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=0; i<n; i++)
scanf("%s",wxy[i]); int len=strlen(wxy[0]);
int ans=0,biginpos=0;
for(int i=0; i<len; i++)
{
int tmp=GetLongestPre(wxy[0]+i,len-i);
if(tmp>=ans)
{
if(tmp>ans)
{
ans=tmp;
biginpos=i;
}
else
{
bool flag=true;
for(int t=0; t<ans; t++)
{
if(wxy[0][biginpos+t] > wxy[0][i+t]) break;
else if(wxy[0][biginpos+t] < wxy[0][i+t])
{
flag=false;
break;
}
}
if(flag)
biginpos=i;
}
}
}
if(ans)
for(int i=0; i<ans; i++)
printf("%c",wxy[0][biginpos+i]);
else
printf("IDENTITY LOST");
puts("");
}
return 0;
}

POJ3450【KMP理解】的更多相关文章

  1. KMP 理解

    例题 以字符串 ABABACA 为例 a 前缀: 后缀: 结果为0 ab 前缀:a 后缀: b 结果为0 aba 前缀:a ab 后缀: ba a 结果为1,此时 i=2,j=1 abab 前缀:a ...

  2. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  3. KMP高质量代码实现详解

    KMP算法 对于KMP算法我分为两个部分说明,第一部分是算法部分,介绍KMP算法的算法思想:第二部分是实现部分,介绍一种厉害的实现代码以及代码注释.当然了由于本文主要介绍怎么实现故而先分析实现,对KM ...

  4. BZOJ 3670 NOI2014 动物园 KMP+dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3670 题意概述:令num[i]表示字符串由1~i的字符形成的前缀中不相重叠的相同前后缀的数 ...

  5. 算法之美--3.2.3 KMP算法

    不知道看了几遍的kmp,反正到现在都没有弄清楚next[j]的计算和kmp的代码实现,温故而知新,经常回来看看,相信慢慢的就回了 从头到尾彻底理解KMP 理解KMP /*! * \file KMP_算 ...

  6. 初涉KMP算法

    久仰字符串系列理论 KMP 讲解(引用自bzoj3670动物园) 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有 ...

  7. 【BZOJ】【1009】 【HNOI2008】GT考试

    DP/KMP/矩阵乘法 好神的题啊……跪了跪了 $n\leq 10^9$是什么鬼……我们还是先不要考虑这个鬼畜的玩意了>_> 用类似数位DP的思路,我们可以想到一个DP方程:$f[i][j ...

  8. 从头到尾彻底理解KMP

    从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的201 ...

  9. 深入理解kmp中的next数组

    next数组 1. 如果对于值k,已有p0 p1, ..., pk-1 = pj-k pj-k+1, ..., pj-1,相当于next[j] = k. 此意味着什么呢?究其本质,next[j] = ...

随机推荐

  1. MongoDB之增删改查(一)

    本文主要介绍MongoDB数据库增删改查操作. 增 mongoDB和其它关系型数据库一样,通过insert来添加数据到集合中去. db.collectionName.insert(内容) 显示数据库中 ...

  2. XML解析PULL

    解析xml是很经常使用的操作,除了SAX和DOM两种最经常使用的解析xml外,Pull解析器解析XML文件. 在Android的源代码中大量的使用Pull解析.pull不仅更加的面相对象,并且使用速度 ...

  3. LVS集群中的IP负载均衡技术

    LVS集群中的IP负载均衡技术 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 4 月 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集 ...

  4. [haoi2008]玩具命名

    某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很 ...

  5. requirejs测试

    参考资料:http://www.ruanyifeng.com/blog/2012/11/require_js.html 一.文件目录 二.html <!DOCTYPE html> < ...

  6. poj2773 —— 二分 + 容斥原理 + 唯一分解定理

    题目链接:http://poj.org/problem?id=2773 Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submi ...

  7. node.js 开发博客系统

    1. 安装yoman :npm install -g yo 2. 安装 generator-express :npm install -g generator-express 3. 安装 bower ...

  8. Unable to create Debug Bridge:Unable to start adb server:error:cannot parse version

    打开Android Studio时报如下错误提示: Unable to create Debug Bridge:Unable to start adb server:error:cannot pars ...

  9. js获取dom对象style样式的值

    js获取到的dom对象的style通常是没有值得,因为我们都写在外部文件中,从慕课网上见到讲师封装的一个方法,挺不错.特此记录下来. function getStyle(obj,attr){ if(o ...

  10. BLOB二进制大数据

    What is a Blob? A blob object represents a chuck of bytes that holds data of a file. But a blob is n ...