标签:
Language:
Substrings
Description
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed
by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
Output
There should be one line per test case containing the length of the largest string found.
Sample Input 2 3 ABCD BCDFF BRCD 2 rose orchid Sample Output 2 2 Source |
code:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> using namespace std; #define rep(i, l, r) for (int i = l; i <= r; i++) #define REP(i, l, r) for (int i = l; i >= r; i--) #define MAXN 1010 int len, next[MAXN], a[MAXN][MAXN], T_T, n, minlen, l[MAXN], f[MAXN], ans; inline void getnext(int *a, int len) { memset(next, 0, sizeof(next)); next[0] = -1; int i = 0, j = -1; while(i < len-1) { if (!~j || a[i] == a[j]) i++, j++, next[i] = j; else j = next[j]; } } inline bool kmp(int *s, int n, int *a, int m) { getnext(a, m); int i = 0, j = 0; while (i < n) { if (!~j || s[i] == a[j]) i++, j++; else j = next[j]; if (j == m) return 1; } return 0; } int main() { cin >> T_T; while (T_T--) { ans = 0; cin >> n; minlen = 12345678; char ch[MAXN]; int kk; rep(i, 1, n) { scanf("%s", ch); if (int(strlen(ch)) < minlen) { minlen = int(strlen(ch)); kk = 2*i - 1; } minlen = min(minlen, int(strlen(ch))); rep(j, 0, strlen(ch)-1) a[2*i-1][j] = int(ch[j]); rep(j, 0, strlen(ch)-1) a[2*i][strlen(ch)-1-j] = int(ch[j]); l[2*i-1] = l[2*i] = strlen(ch); } rep(L, 0, minlen-1) { rep(R, L, minlen-1) { memset(f, 0, sizeof(f)); rep(i, 0, R-L) f[i] = a[kk][i+L]; bool flag = 0; rep(i, 1, n) if (!kmp(a[2*i-1], l[2*i-1], f, R-L+1) && !kmp(a[2*i], l[2*i], f, R-L+1)) { flag = 1; break; } if (!flag) ans = max(ans, R-L+1); } } cout << ans << endl; } }
kyeremal-poj1226-Substrings-模式匹配
标签:
原文地址:http://blog.csdn.net/kyeremal/article/details/46293943