Substrings exp | ||
| ||
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 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
|
-------------
从最短的字符串开始,从大到小枚举字串长度以及起点
-------------
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
char s[222][222];
char tmp[222];
char pmt[222];
int ans;
bool ok;
int main()
{
int T,len,p;
scanf("%d",&T);
while (T--)
{
len=p=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",s[i]);
if (strlen(s[i])>len)
{
len=strlen(s[i]);
p=i;
}
}
for (int L=len;L>=0;L--)
{
for (int i=0;i+L<=len;i++)
{
for (int k=0;k<L;k++)
{
tmp[k]=s[p][i+k];
}
tmp[L]='\0';
int ll=strlen(tmp);
for (int g=0;g<ll;g++)
{
pmt[g]=tmp[ll-g-1];
}
pmt[ll]='\0';
ok=true;
for (int j=1;j<=n;j++)
{
if (strstr(s[j],tmp)==NULL&&strstr(s[j],pmt)==NULL)
{
ok=false;
break;
}
}
if (ok)
{
ans=L;
break;
}
}
if (ok) break;
}
printf("%d\n",ans);
}
return 0;
}