| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
KMP172k0ms!自己写的模板大家可以拿去(擠进2000名纪念)#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void buildBorderArray(int *border, char* s, int size, int dir) {
//int size = strlen(s);
//cout << s.size() << endl;
//border = new int[s.size() + 1];
border[0] = -1;
for(int i = 0; i < size-1; i++){
int bor = border[i];
while(bor >= 0 && *(s+(i+1)*dir) != *(s+ (bor + 1)*dir)){
bor = border[bor];
}
if(*(s+(i+1)*dir) == *(s+(bor+1)*dir)) border[i+1] = bor + 1;
else border[i+1] = -1;
//cout << border[i+1] << endl;
}
}
int searchKmp(char* str, int strsize, int strdir, char* pat, int patsize, int patdir, int *border){
//看能匹配多长,返回长度
//vector<int> res;
//int patsize = strlen(pat);
//if(strsize < patsize) return -1;
//int border[1005];
// buildBorderArray(border, pat, patsize);
int i = 0, j = 0, mx = 0;
while(i <= strsize){
while(j < patsize && i < strsize && *(str+i*strdir) == *(pat+j*patdir)){
i++; j++;
//cout << i << " " << j << endl;
}
if(j == patsize) {
return patsize;
}
if(mx < j) mx = j;
if(j == 0) i++;
else j = border[j-1] + 1;
if(mx < j) mx = j;
}
return mx;
}
int main() {
int T;
scanf("%d", &T);
for(int ii = 0; ii < T; ii++){
char str[110][110];
int N;
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%s", str[i]);
}
if(N == 1){
printf("%d\n", strlen(str[0]));
continue;
}
int len[110], minLen = 110, minArg = -1;
for(int i = 0; i < N; i++){
int tempLen = strlen(str[i]);
len[i] = tempLen;
if(tempLen < minLen) {
minLen = tempLen;
minArg = i;
}
}
//cout << minLen << " " << minArg << endl;
int yjpp = 0;
for(int chang = minLen; chang >= 1; chang--){
if(chang <= yjpp) break;
int border[110];
buildBorderArray(border, str[minArg] + minLen - chang, chang, 1);
int zdpp = chang;
for(int i = 0; i < N; i++){
if(i == minArg) continue;
int zxpp = searchKmp(str[i], len[i], 1, str[minArg] + minLen - chang, chang, 1, border);
int fxpp = searchKmp(str[i]+len[i]-1, len[i], -1, str[minArg] + minLen - chang, chang, 1, border);
//cout << zxpp << " " << fxpp << endl;
int temp = (zxpp > fxpp)? zxpp : fxpp;
if(temp < zdpp) zdpp = temp;
}
if(zdpp > yjpp) yjpp = zdpp;
if(chang <= yjpp) break;
zdpp = chang;
buildBorderArray(border, str[minArg] + chang - 1, chang, -1);
for(int i = 0; i < N; i++){
if(i == minArg) continue;
int zxpp = searchKmp(str[i], len[i], 1, str[minArg] + chang - 1, chang, -1, border);
int fxpp = searchKmp(str[i]+len[i]-1, len[i], -1, str[minArg] + chang - 1, chang, -1, border);
//cout << zxpp << " " << fxpp << endl;
int temp = (zxpp > fxpp) ? zxpp : fxpp;
if(temp < zdpp) zdpp = temp;
}
if(zdpp > yjpp) yjpp = zdpp;
//cout << endl;
}
printf("%d\n", yjpp);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator