kuangbin专题十六 KMP&&扩展KMP HDU1238 Substrings
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.
InputThe first line of the input file 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.
OutputThere should be one line per test case containing the length of the largest string found.
Sample Input
2 3 ABCD BCDFF BRCD 2 rose orchidSample Output
2 2
这道题和之前一道题类似,都是多个字符串匹配问题,只是这道题多了倒序的匹配。直接reverse就可以了
遍历第一个串的所有后缀,然后匹配每个字符串的正反序。得到公共匹配的最小。然后枚举所有后缀取最大
1 #include<stdio.h> 2 #include<iostream> 3 #include<string> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 int _,n,Next[110]; 8 vector<string> t; 9 10 void prekmp(string s) { 11 int len=s.size(); 12 int i,j; 13 j=Next[0]=-1; 14 i=0; 15 while(i<len) { 16 while(j!=-1&&s[i]!=s[j]) j=Next[j]; 17 Next[++i]=++j; 18 } 19 } 20 21 int kmp(string t,string p) { 22 int lent=t.size(),lenp=p.size(); 23 int i=0,j=0,ans=-1,res; 24 res=-1; 25 while(i<lent) { 26 while(j!=-1&&t[i]!=p[j]) j=Next[j]; 27 ++i;++j; 28 res=max(res,j); 29 } 30 ans=max(ans,res); 31 reverse(t.begin(),t.end()); 32 res=-1; 33 i=0,j=0; 34 while(i<lent) { 35 while(j!=-1&&t[i]!=p[j]) j=Next[j]; 36 ++i;++j; 37 res=max(res,j); 38 } 39 ans=max(ans,res); 40 return ans; 41 } 42 43 int main() { 44 // freopen("in","r",stdin); 45 for(scanf("%d",&_);_;_--) { 46 scanf("%d",&n); 47 string s; 48 for(int i=0;i<n;i++) { 49 cin>>s; 50 t.push_back(s); 51 } 52 string str=t[0],tempstr; 53 int len=str.size(),maxx=-1; 54 for(int i=0;i<len;i++) { 55 tempstr=str.substr(i,len-i); 56 int ans=0x3f3f3f; 57 prekmp(tempstr); 58 for(int j=1;j<t.size();j++) { 59 ans=min(kmp(t[j],tempstr),ans); 60 } 61 maxx=max(maxx,ans); 62 } 63 printf("%d\n",maxx); 64 t.clear(); 65 } 66 }
埋骨何须桑梓地,人生无处不青山