传送门:http://poj.org/problem?id=3080
题目大意:给定M个字符串(2<=M<=10),长度不超过60个字符,要求求出他们的最长公共子串,如果存在多个解,输出字典序最小的,如果该子串长度小于3,输出no ....(见题目描述)
思路:枚举某一个字符串的所有子串,拿去和剩余的所有字符串匹配,保存长度最大且字典序最小的即可,无所谓用KMP,暴力就行了,算法的主要时间花在枚举子串上面,这里为了练习KMP还是写了个KMP的匹配.
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN = 11,MAXM = 66;
char s[MAXN][MAXM],res[MAXM],temp[MAXM];
int Next[MAXM];
void MakeNext(char *str){
int M = strlen(str);
int i = 0, j = -1;Next[0] = -1;
while(i<M){
if(j==-1||str[i]==str[j])Next[++i]=++j;
else j = Next[j];
}
}
int KMP(char *T,char *P){
int N = strlen(T), M = strlen(P);
int i = 0, j = 0;
while(i<N&&j<M){
if(j==-1||T[i]==P[j])i++,j++;
else j = Next[j];
}
return j==M?i-M:-1;
}
bool great(char *s1,char *s2){
int l1 = strlen(s1),l2 = strlen(s2);
if(l1!=l2)return l1>l2;
else{
return strcmp(s1,s2)<0;
}
}
int main(){
int n,m;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%s",s[i]);
}
MakeNext(s[0]);res[0] = 0;
int L = strlen(s[0]);
for(int i=0;i<L;i++){
for(int j=i;j<L;j++){
for(int k=0;k<j-i+1;k++)temp[k]=s[0][k+i];
temp[j-i+1] = 0;
int ok = 1;
for(int i=1;i<m;i++){
if(KMP(s[i],temp)==-1){
ok = 0;
break;
}
}
if(ok){
if(great(temp,res)){
strcpy(res,temp);
}
}
}
}
int lr = strlen(res);
if(lr<3){
printf("no significant commonalities\n");
}else{
printf("%s\n",res);
}
}
return 0;
}
分享到:
相关推荐
《KMP算法在POJ题目中的应用》 KMP(Knuth-Morris-Pratt)算法,是一种在字符串中寻找子串的搜索算法,由Donald Knuth、Vaughan Pratt和James H. Morris三位学者于1970年代提出。在编程竞赛如POJ(Problemset On...
* 串:例如 poj1035、poj3080、poj1936。 * 排序:例如 poj2388、poj2299。 * 简单并查集的应用。 * 哈希表和二分查找等高效查找法:例如 poj3349、poj3274、poj2151、poj1840、poj2002、poj2503。 * 哈夫曼树...
- 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如快速排序和归并排序,用于对数据进行排序,如`poj2388, poj2299`。 - 并查集:用于处理集合的合并和查询...
poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...
- (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - (poj2388, poj2299):介绍二叉树、平衡二叉树等。 3. **字符串处理**: - (poj3349, poj3274, POJ2151, poj1840, poj2002, poj...
算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP算法 KMP
如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合...
在KMP算法的基础上,可以通过建立更复杂的部分匹配表或者使用额外的数据结构来处理这两种情况,使得算法能够灵活地处理不同类型的通配符。 在实际应用中,KMP算法通常用于文本编辑器的查找替换功能、文件系统的模糊...
1. **树和二叉树**:树和二叉树的基本操作和应用(poj1035, poj3080, poj1936)。 2. **堆**:堆排序及其在优先队列中的应用(poj2388, poj2299)。 3. **哈希表**:用于快速查找和存储,如Hash函数的设计(poj3349,...
【压缩包子文件的文件名称列表】"POJ"很可能表示所有解题报告都直接以题目编号命名,这样的命名方式便于用户快速定位到自己感兴趣的题目或者直接对应POJ平台上的题目进行学习。 在这些解题报告中,你可能会学习到...
例如,题目poj1961和poj2406就是KMP算法的应用实例。 ### 7. 几何算法 几何算法涉及点、线、面的性质和关系,如凸包、最近点对、三角剖分等问题。这些算法在计算机图形学、地理信息系统等领域有着广泛的应用。例如...
* 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002、POJ2503 * 哈夫曼树:POJ3253 * 背包问题:POJ1837、POJ1276 * DP算法:POJ3267、POJ1836、...
2. **POJ1790**:可能涉及字符串的模式匹配,如KMP算法或Boyer-Moore算法,用于在一个字符串中寻找另一个字符串的出现位置。 3. **POJ1951**:可能与字符串的排序有关,比如可以运用Manacher's Algorithm解决最长...
- 推荐题目:[poj1035](https://vjudge.net/problem/POJ-1035)、[poj3080](https://vjudge.net/problem/POJ-3080)、[poj1936](https://vjudge.net/problem/POJ-1936) - 堆结构通常用于实现优先队列等数据结构。 2...
在探讨KMP算法之前,先要了解暴力匹配算法,也称为朴素匹配算法。暴力匹配算法的基本思想是:在文本串S中逐个比较每个字符与模式串P的第一个字符是否相同,如果相同则继续比较下一个字符,如果不同,则将模式串向右...
* 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单并查集的应用 * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj...
"poj练习2"可能是第二组或第二部分的解答,而"poj练习"可能是更综合或者第一部分的习题解答。它们可能包含了各种编程语言(如C、C++、Java等)的代码实现,覆盖了数据结构、算法等多个方面。 详细知识点可能包括: ...
KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Morris和Robert Pratt三位学者提出。它的主要目标是在一个长字符串(主串A)中查找是否存在一个指定的短字符串(模式...
- POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的选择与应用。 #### 二分查找 - **题目示例**: - POJ 3373、POJ 1691:二分查找技术的...
KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中高效地查找子串的算法,由D.E. Knuth、V.R. Morris和J.H. Pratt在1970年代提出。这个算法避免了在匹配过程中频繁的回溯,极大地提高了查找效率。在给定的"KMP.rar...