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 orchidSample Output
2 2
题意:找出所有字符串中的公共串,倒过来也算。
思路:使用strstr(a,b)函数(可以匹配b中是否存在a),直接暴力枚举,找出最短的串,用最短的串中的子串暴力枚举每一个串。
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int t,n;
char a[150][110];
int find_ans(int len,int index)
{
int flag;
char S[110],pos[110],iny[110];
strcpy(S,a[index]);
int l=len;
while(l>0)
{
for(int i=0; i<=len-l; i++)
{
flag=1;
strncpy(pos,S+i,l);
pos[l]='\0';
for(int j=0; j<l; j++)
iny[j]=pos[l-j-1];
iny[l]='\0';
for(int j=0;j<n;j++)
{
if(strstr(a[j],pos)==NULL&&strstr(a[j],iny)==NULL)
{
flag=0;
break;
}
}
if(flag)
break;
}
if(flag)
break;
--l;
}
return l;
}
int main()
{
int min_len,index;
scanf("%d",&t);
while(t--)
{
min_len=1000;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%s",a[i]);
int len=strlen(a[i]);
index=min_len>len?i:index;
min_len=min_len>len?len:min_len;
}
printf("%d\n",find_ans(min_len,index));
}
return 0;
}