1. 程式人生 > >hdu 1238 Substrings(kmp+暴力枚舉)

hdu 1238 Substrings(kmp+暴力枚舉)

tin () first there ber ons ret HERE xtra

Problem 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 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.

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 題意&思路:和poj 3080 類似

#include<cstdio>
#include<cstring>
#include
<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define
ll long long int using namespace std; inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1}; int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1}; const int inf=0x3f3f3f3f; const ll mod=1e9+7; int nextt[107]; bool vis[207]; void getnext(string s){ nextt[1]=0; int len=s.length(); for(int i=2,j=0;i<=len;i++){ while(j>0&&s[i-1]!=s[j]) j=nextt[j]; if(s[i-1]==s[j]) j++; nextt[i]=j; } } bool kmp(string t,string p){ int len1=p.length(); int len2=t.length(); for(int i=1,j=0;i<=len1;i++){ while(j>0&&p[i-1]!=t[j]) j=nextt[j]; if(p[i-1]==t[j]) j++; if(j==len2) return true; } return false; } string s[207]; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; int len=s[1].length(); //cout<<len<<endl; int ans=0; for(int i=1;i<=len;i++){ for(int j=0;j<=len-i;j++){ string temp=s[1].substr(j,i); getnext(temp); bool f=1; for(int k=1;k<=n;k++){ string pre=s[k]; if(kmp(temp,pre)) continue; reverse(pre.begin(),pre.end()); if(kmp(temp,pre)) continue; f=0; break; } if(f) ans=max(ans,i); } } cout<<ans<<endl; } return 0; }

hdu 1238 Substrings(kmp+暴力枚舉)