奇怪,这题是POJ3080修改而ac的,在POJ3080却过不了,很诡异的说。。。难道哥的RP低成这样?!
#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 205
char str[4005][N];
int p[N];
int m;
int l[N];
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 () {
while (scanf("%d",&m) && m) {
int i,j;//
for (i = 1; i <= m; i++) {
scanf("%s",str[i]+1);
l[i] = strlen(str[i]+1);
//printf("!%s\n",str[i]+1);
}
char ss[N],ans[N];
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) == 0) puts("IDENTITY LOST");
else printf("%s\n",ans+1);
}
return 0;
}
本文介绍了一道基于POJ3080修改的ACM竞赛题目的解决方案,采用KMP算法进行字符串匹配,通过动态规划求解最长公共前缀,并针对多个目标字符串进行匹配验证。
1万+

被折叠的 条评论
为什么被折叠?



