题目链接:http://poj.org/problem?id=3450

题目大意:给定n个长度不超过200的字符串,n < 4000。求这些字符串的最长公共子串,若没有,则输出 “IDENTITY LOST”。

思路:

1.枚举第一个字符串的各个子串s,将s分别与其他字符串进行kmp,来找到可以取得的s的最大长度(这样就是一次枚举中所有字符串的公共子串),然后接着枚举子串s,更新这个长度,注意在长度相等时选取字典序小即可。

2.strcmp(a, b)比较a, b字符串,返回值为0则字符串相同。返回值大于0则a的字典序大于b的字典序,返回值小于0则a的字典序小于b的字典序。

3.strcpy(a, b)将b字符串复制给a,strncpy(a, b, len)将b字符串前len个长度的字符复制给a,注意需要手动给a添加结束符 '\0'.

代码:

 #include<stdio.h>
#include<string.h>
#include<algorithm>
const int inf = 0x3f3f3f3f;
using namespace std; char str[][], s[], res[], tt[];
int next[], temp, s_len, str_len, flag; void get_next()
{
s_len = strlen(s);//模式串
next[] = -;
int j = , k = -;
while(j < s_len)
{
if(k == - || s[j] == s[k])
{
j ++, k ++;
next[j] = k;
}
else
k = next[k];
}
} void kmp(int id)
{
temp = ;
str_len = strlen(str[id]);
int i = , j = ; //i文本串 j模式串
int vis = ;
while(i < str_len && j < s_len)
{
if(s[j] == str[id][i] || j == -)
{
vis = ;
i ++, j ++;
}
else
j = next[j];
temp = max(temp, j);
}
if(!vis)
flag = ;
} int main()
{
int n, minn, ans_len, xx;
while(scanf("%d", &n) != EOF)
{
if(n == )
break;
getchar();
ans_len = -;
for(int i = ; i < n; i ++)
scanf("%s", str[i]);
int len = strlen(str[]);
for(int i = ; i < len; i ++)
{
minn = inf, xx = ;
strcpy(s, str[] + i);
get_next();
flag = ;
for(int j = ; j < n; j ++)
{
kmp(j);
if(flag == )
{
xx = ;
break;
}
minn = min(minn, temp);
}
if(xx == )
continue;
if(minn > ans_len)
{
ans_len = minn;
strncpy(res, s, ans_len);
res[ans_len] = '\0';
}
if(minn == ans_len)
{
strncpy(tt, s, minn);
tt[minn] = '\0';
if(strcmp(res, tt) > )
strcpy(res, tt);
}
}
if(ans_len == || ans_len == -)
printf("IDENTITY LOST\n");
else
printf("%s\n", res);
}
return ;
}

POJ3450最长公共子串【kmp】的更多相关文章

  1. 【intern】最长公共子串、编辑距离、KMP 等

    这可能是一个很长的blog…… # from https://blog.csdn.net/justheretobe/article/details/51764587 #!/usr/bin/env py ...

  2. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  3. 【实习记】2014-08-29算法学习Boyer-Moore和最长公共子串(LCS)

        昨天的问题方案一:寻找hash函数,可行性极低.方案二:载入内存,维护成一个守护进程的服务.难度比较大.方案三:使用前5位来索引,由前3位增至前5位唯一性,理论上是分拆记录扩大100倍,但可以 ...

  4. 利用后缀数组(suffix array)求最长公共子串(longest common substring)

    摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...

  5. 【poj1226-出现或反转后出现在每个串的最长公共子串】后缀数组

    题意:求n个串的最长公共子串,子串出现在一个串中可以是它的反转串出现.总长<=10^4. 题解: 对于每个串,把反转串也连进去.二分长度,分组,判断每个组. #include<cstdio ...

  6. [codevs3160]最长公共子串解题报告|后缀自动机

    给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 样例就觉得不能更眼熟啊...好像之前用后缀数组做过一次 然后发现后缀自动机真的好好写啊...(当然当时学后缀数组的时候也这么认为... 这 ...

  7. HDU 1503 带回朔路径的最长公共子串

    http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...

  8. 最长公共子序列PK最长公共子串

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...

  9. 动态规划(一)——最长公共子序列和最长公共子串

    注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...

随机推荐

  1. java+上传后的文件展示

    文件夹结构支持 大文件上传控件6支持向服务器上传整个文件夹,并且在服务端保存时与本地目录结构完全保持一致,同时在数据库中也保留文件夹的层级结构.开发人员可以借助于数据库中的层级信息方便的管理文件,管理 ...

  2. luogu 2294 [HNOI2005]狡猾的商人 差分约束

    一个差分约束模型,只需判一下有没有负环即可. #include <bits/stdc++.h> #define N 103 #define M 2004 #define setIO(s) ...

  3. 【luoguP2158】 [SDOI2008]仪仗队

    题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...

  4. vue项目更换目录后执行npm run dev 就报错(新手进)

    在我们搭建好一个VUE项目的环境后,觉得这个项目存放的位置不好,想移动一下,但是移动后我们发现执行npm run dev就会报下面的错误: 明明只是移动了一下位置,就报错,实在是太恶心了. 但是只要我 ...

  5. 5.rabbitmq--通配符模式Topics

    rabbitmq--通配符模式Topics topic模式也称为主题模式,其实他相对于routing模式最大的好处就是他多了一种匹配模式的路由,怎么理解匹配呢,其实就相当于我们之前正则的.*这种,不过 ...

  6. mac使用frida

    mac使用frida 安装 https://github.com/frida/frida/releases 根据手机的cpu的版本,选择相应的文件,一般通过手机信息可以看到 我这里是frida-ser ...

  7. Mybatis-Plus BaseMapper自动生成SQL及MapperProxy

    目录 Spring+Mybatis + Mybatis-Plus 自定义无XML的sql生成及MapperProxy代理生成 问题产生背景 框架是如何使用 无Xml的SQL是如何生成生成及SQL长成什 ...

  8. Vue.js 生命周期、计算属性及侦听器

    一.创建一个Vue实例 每个Vue应用都是使用Vue函数创建一个Vue实例.所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外). 数据和方法 当一个实例被创建后,它 ...

  9. Qt串口通信专题教程

    查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...

  10. Docker 数据管理(Volumes)

    Docker 容器产生的数据在可写层,如果不通过 docker commit 生成新的镜像,使得数据成为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了. Docker 提供了三种数据 Mo ...