HDOJ1238(Substrings) 暴力过
Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1258 Accepted Submission(s): 572
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
//1245883 2009-04-08 08:52:09 Accepted 1238 15MS 248K 1234 B C++ Xredman
#include <iostream>
#include <cstring>
using namespace std;
const int N = 102;
char str[N][N], shortStr[N];
int len[N], shortLen;
int t, n, cc;
bool found(char *pp)
{
for(int i = 0; i < n; i++)
if(i != cc && !strstr(str[i], pp) )
return false;
return true;
}
int main()
{
char ss[N], rr[N];
int tt, i, j, k;
bool flag;
while(cin>>t)
while(t-- && cin>>n)
{
cc = shortLen = -1;
for(i = 0; i < n; i++)
{
cin>>str[i];
len[i] = strlen(str[i]);
if(shortLen == -1 || len[i] < shortLen)
{
cc = i;
shortLen = len[i];
}
}
strcpy(shortStr, str[cc]);
tt = shortLen;flag = false;
while(tt > 0)
{
for(i = 0; i + tt <= shortLen; i++)
{
for(j = i, k = 0; k < tt; k++, j++)
ss[k] = shortStr[j];
ss[k] = '\0';
//cout<<"SS "<<ss<<endl;
if(found(ss))
{
flag = true;
break;
}
for(j = shortLen - i - 1, k = 0; k < tt; k++, j--)
rr[k] = shortStr[j];
rr[k] = '\0';
//cout<<"RR "<<rr<<endl;
if(found(rr))
{
flag = true;
break;
}
}
if(flag)
break;
tt--;
}
cout<<tt<<endl;
}
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
const int N = 102;
char str[N][N], shortStr[N];
int len[N], shortLen;
int t, n, cc;
bool found(char *pp)
{
for(int i = 0; i < n; i++)
if(i != cc && !strstr(str[i], pp) )
return false;
return true;
}
int main()
{
char ss[N], rr[N];
int tt, i, j, k;
bool flag;
while(cin>>t)
while(t-- && cin>>n)
{
cc = shortLen = -1;
for(i = 0; i < n; i++)
{
cin>>str[i];
len[i] = strlen(str[i]);
if(shortLen == -1 || len[i] < shortLen)
{
cc = i;
shortLen = len[i];
}
}
strcpy(shortStr, str[cc]);
tt = shortLen;flag = false;
while(tt > 0)
{
for(i = 0; i + tt <= shortLen; i++)
{
for(j = i, k = 0; k < tt; k++, j++)
ss[k] = shortStr[j];
ss[k] = '\0';
//cout<<"SS "<<ss<<endl;
if(found(ss))
{
flag = true;
break;
}
for(j = shortLen - i - 1, k = 0; k < tt; k++, j--)
rr[k] = shortStr[j];
rr[k] = '\0';
//cout<<"RR "<<rr<<endl;
if(found(rr))
{
flag = true;
break;
}
}
if(flag)
break;
tt--;
}
cout<<tt<<endl;
}
return 0;
}