noi2015模板-kmp

来源:互联网 发布:软件著作权许可 编辑:程序博客网 时间:2024/06/07 23:24
#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 1010int 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;    }}

0 0
原创粉丝点击