POJ3080 Blue Jeans
2014-08-29 10:56
399 查看
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <list> #include <deque> #include <queue> #include <cctype> #include <map> #include <set> #include <bitset> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iomanip> #include <cstdlib> #include <ctime> #include <cassert> #include <limits> #include <fstream> using namespace std; #define mem(A, X) memset(A, X, sizeof A) #define pb(x) push_back(x) #define mp(x,y) make_pair((x),(y)) #define vi vector<int> #define all(x) x.begin(), x.end() #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e) #define sz(x) (int)((x).size()) #define sl(a) strlen(a) #define rep(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) #define Rep(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define min3(a,b,c) min(a,min(b,c)) #define max3(a,b,c) max(a,max(b,c)) #define dbg(a) cout << a << endl; #define fi first #define se second typedef long long int64; int gcd(const int64 &a, const int64 &b) {return b == 0 ? a : gcd(b, a % b);} int64 int64pow(int64 a, int64 b){if(b == 0) return 1;int64 t = int64pow(a, b / 2);if(b % 2) return t * t * a;return t * t;} const int inf = 1 << 30; const double eps = 1e-8; const double pi = acos(-1.0); const int MAX_N = 65; char text[15][MAX_N], pattern[MAX_N]; int m, T, next[MAX_N], ans, tmpans; char result[MAX_N]; void GetNext(char *pattern) { int i = 0, j = -1; next[0] = -1; int LenP = strlen(pattern); while (i < LenP) { if (j == -1 || pattern[i] == pattern[j]) { ++i; ++j; next[i] = j; } else { j = next[j]; } } } void KMP(char *pattern, char *text) { int LenP = strlen(pattern), LenT = strlen(text); int i = 0, j = 0, n = 0; while (i < LenT && j < LenP) { if (j == -1 || text[i] == pattern[j]) { ++i; ++j; } else { j = next[j]; } if(j > n) n = j; } if(n < tmpans) tmpans = n; } void solve() { rep(i, 0, m) { scanf("%s", text[i]); } ans = 0; Rep(i, 0, 57) { strcpy(pattern, text[0] + i); GetNext(pattern); tmpans = 100; rep(k, 1, m) { KMP(pattern, text[k]); } if(ans < tmpans) { ans = tmpans; strncpy(result, text[0] + i, ans); result[ans] = '\0'; } else if(ans == tmpans) { // 存在多个最长公共子串,输出字典序最小的 char tmp[MAX_N]; strncpy(tmp, text[0] + i, ans); tmp[ans] = '\0'; if(strcmp(tmp, result) < 0) strcpy(result, tmp); } } if(ans >= 3) printf("%s\n", result); else printf("no significant commonalities\n"); } int main() { cin >> T; while (cin >> m) { solve(); } return 0; }
相关文章推荐
- POJ3080 Blue Jeans
- POJ3080 Blue Jeans(暴力kmp)
- POJ3080Blue Jeans
- POJ3080:Blue Jeans
- poj3080Blue Jeans
- POJ3080 Blue Jeans(KMP,求最长公共子串)
- POJ3080:Blue Jeans
- poj3080 Blue Jeans(后缀数组+二分答案)
- poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)
- poj3080(Blue Jeans)kmp求多个串公共子串
- poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)
- poj3080Blue Jeans
- poj3080 Blue Jeans-------KMP
- POJ3080《Blue Jeans》方法:暴力
- POJ3080 Blue Jeans 最长公共子串
- poj3080 Blue Jeans KMP+枚举
- POJ3080 - Blue Jeans(KMP+二分)
- poj3080Blue Jeans(kmp + 枚举)
- poj3080Blue Jeans
- poj3080 Blue Jeans (多个字符串匹配)