POJ 3450 Corporate Identity(KMP)
【题目链接】 http://poj.org/problem?id=3450
【题目大意】
求k个字符串的最长公共子串,如果有多个答案,则输出字典序最小的。
【题解】
我们对第一个串的每一个后缀和其余所有串做kmp,取匹配最小值的最大值就是答案。
【代码】
#include <cstring>
#include <cstdio>
#include <algorithm>
const int N=4050,M=210;
using namespace std;
int nxt[M],n;
char dict[N][M];
void get_nxt(char *a,int n){
int i,j;
for(nxt[0]=j=-1,i=1;i<n;nxt[i++]=j){
while(~j&&a[j+1]!=a[i])j=nxt[j];
if(a[j+1]==a[i])j++;
}
}
int LongestPre(char *s,int len){
get_nxt(s,len);
for(int i=1;i<n;i++){
char *p=dict[i];
int ans=0;
for(int j=-1;*p;p++){
while(~j&&s[j+1]!=*p)j=nxt[j];
if(s[j+1]==*p){
j++; ans=max(ans,j+1);
}if(j==len-1)j=nxt[j];
}len=min(len,ans);
}return len;
}
int main(){
while(scanf("%d",&n)&&n){
getchar();
for(int i=0;i<n;i++)gets(dict[i]);
int len=strlen(dict[0]),ans=0,pos=0;
for(int i=0;i<len;i++){
int tmp=LongestPre(dict[0]+i,len-i);
if(tmp>=ans){
if(tmp>ans)ans=tmp,pos=i;
else{
bool flag=1;
for(int t=0;t<ans;t++){
if(dict[0][pos+t]>dict[0][i+t])break;
else if(dict[0][pos+t]<dict[0][i+t]){flag=0;break;}
}if(flag)pos=i;
}
}
}if(ans){
for(int i=0;i<ans;i++)putchar(dict[0][pos+i]);
puts("");
}else puts("IDENTITY LOST");
}return 0;
}
POJ 3450 Corporate Identity(KMP)的更多相关文章
- POJ 3450 Corporate Identity (KMP,求公共子串,方法很妙)
http://blog.sina.com.cn/s/blog_74e20d8901010pwp.html我采用的是方法三. 注意:当长度相同时,取字典序最小的. #include <iostre ...
- POJ 3450 Corporate Identity (KMP+暴搞)
题意: 给定N个字符串,寻找最长的公共字串,如果长度相同,则输出字典序最小的那个. 找其中一个字符串,枚举它的所有的字串,然后,逐个kmp比较.......相当暴力,可二分优化. #include & ...
- POJ 题目3450 Corporate Identity(KMP 暴力)
Corporate Identity Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5493 Accepted: 201 ...
- POJ 2406 Power Strings(KMP)
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- HDU - 2328 Corporate Identity(kmp+暴力)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2328 题意:多组输入,n==0结束.给出n个字符串,求最长公共子串,长度相等则求字典序最小. 题解:(居 ...
- POJ 3450 Corporate Identity KMP解决问题的方法
这个问题,需要一组字符串求最长公共子,其实灵活运用KMP高速寻求最长前缀. 请注意,意大利愿父亲:按照输出词典的顺序的规定. 另外要提醒的是:它也被用来KMP为了解决这个问题,但是很多人认为KMP使用 ...
- POJ 3450 Corporate Identity kmp+最长公共子串
枚举长度最短的字符串的所有子串,再与其他串匹配. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- poj 3450 Corporate Identity
题目链接:http://poj.org/problem?id=3450 题目分类:后缀数组 题意:求n个串的最长公共字串(输出字串) //#include<bits/stdc++.h> # ...
- POJ 2185 Milking Grid(KMP)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4738 Accepted: 1978 Desc ...
随机推荐
- leetcode Linked List Cycle python
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...
- Storm并发度和Grouping方式
Storm并发度和Grouping方式 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans ...
- Traveling
Problem J: Traveling Time Limit: 1 Sec Memory Limit: 32 MB Description SH likes traveling around th ...
- C语言入门(12)——递归
一个函数在它的函数体内调用它自身称为递归调用.有递归调用操作的函数被称为递归函数.递归调用可以是直接调用,也可以是间接调用.也可以理解为函数的嵌套调用是函数本身. 例如实现一个求阶乘的函数: long ...
- 去英国Savile Row 做件私人定制手工西装_GQ男士网
去英国Savile Row 做件私人定制手工西装_GQ男士网 去英国Savile Row 做件私人定制手工西装
- HDU 3037 Saving Beans(Lucas定理的直接应用)
解题思路: 直接求C(n+m , m) % p , 由于n , m ,p都非常大,所以要用Lucas定理来解决大组合数取模的问题. #include <string.h> #include ...
- Unity3d 要点板书
WWW.unity3d.com.cn Unity Project unity的项目文件/专案 Scene unity的场景文件 Scene 场景视窗 Game 预览视窗 H... 物件视窗 Pro ...
- DataReader转泛型
实体类的字段类型要和数据库一致,不然可能会出现错误. /// <summary> /// DataReader转泛型 /// </summary> /// <typepa ...
- Fix Some bytes have been replaced with the Unicode substitution character while loading file XXX.cs with Chinese Simplified (GB2312) encoding
When we use <strong>visual studio</strong> open source file or any other file, we may en ...
- SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)
1.插入检索出的数据 select * from dbo.Customers_1