您的位置:首页 > 其它

【KMP多串最长公共子串】POJ 3080

2011-11-11 21:35 423 查看
思路很简单,就是枚举第一个串求出每种情况是否在以后出现。

用KMP进行匹配。可是就是一直wa!!!所以标记为unsolved

2011-11-11 23:33:27更新:改了POJ 3450几个小地方就过了,真的真的很诡异!

#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout)
#define N 70
char str[15]
;
int p
;
int m;
int l
;
bool chk(char *ss) {
int i,j;
int len = strlen(ss+1);
p[1] = 0;
j = 0;
for (i = 2; i <= len; i++) {
while (j > 0 && ss[i] != ss[j+1]) {
j = p[j];
}
if (ss[i] == ss[j+1]) j++;
p[i] = j;
}
for (int kk = 2; kk <= m; kk++) {
j = 0;
for (i = 1; i <= l[kk]; i++) {
while (j > 0 && ss[j+1] != str[kk][i]) {
j = p[j];
}
if (ss[j+1] == str[kk][i]) j++;
if (j == len) break;
}
if (i > l[kk])return false;
}
return true;
}

int main () {
int t;
scanf("%d",&t);
while (t--) {
scanf("%d",&m);
int i,j;
for (i = 1; i <= m; i++) {
scanf("%s",str[i]+1);
l[i] = strlen(str[i]+1);
}
char ss
,ans
;
int maxlen = 0;
memset(ans,'\0',sizeof(ans));
for (int len = 1; len <= l[1]; len++) {
for (i = 1; i + len <= l[1] + 1; i++) {
int cnt = 1;
for (j = i; j  <= len + i - 1; j++) {
ss[cnt++] = str[1][j];
}
ss[cnt] = '\0';//printf("!%s\n",ss+1);
if (chk(ss)) {
if (len == maxlen) {
if (strcmp(ans+1,ss+1) > 0) {
strcpy(ans+1,ss+1);
}
} else if (len > maxlen) {
maxlen = len;
strcpy(ans+1,ss+1);
}
}
}
}
if (strlen(ans+1) < 3) puts("no significant commonalities");
else printf("%s\n",ans+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: