【KMP多串最长公共子串】POJ 3080
2011-11-11 21:35
423 查看
思路很简单,就是枚举第一个串求出每种情况是否在以后出现。
用KMP进行匹配。可是就是一直wa!!!所以标记为unsolved
2011-11-11 23:33:27更新:改了POJ 3450几个小地方就过了,真的真的很诡异!
用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; }
相关文章推荐
- poj 3080(3450) KMP(暴力也能过) 多个串的最长公共子串
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- poj 3080 Blue Jeans (KMP+最长公共子串)
- POJ 3080(最长公共子串)
- 【KMP求多个串的最长公共子串】POJ 3450
- poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)
- Poj 3080 Blue Jeans + Hdu 2328 Corporate Identity (后缀数组 字典序最小的最长公共子串)
- POJ 3450 Corporate Identity(kmp求多个字符串的最长公共子串)
- POJ-3080 -求n个字符串最长公共子串-暴力枚举
- poj 3450/poj 3080 多串最长公共子串 后缀数组
- poj 1226 求多串最长公共子串 或 回文子串 KMP&&strstr&&后缀数组
- poj--3450 KMP求多个字符串的最长公共子串
- POJ 3080 查找公共最长子串 kmp+枚举
- POJ 3080:Blue Jeans:枚举求解n个字符串的最长公共连续子串
- poj 3450 Corporate Identity (KMP+最长公共子串)
- POJ 3080 Blue Jeans(KMP:最长连续公共子序列)
- poj 3080 Blue Jeans【KMP】【求公共子串】
- poj 3080 Blue Jeans (多串最长公共子串 暴力)
- poj 3080 Blue Jeans(最长公共子串)