Substrings
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7379 | Accepted: 2465 |
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
Source
Tehran 2002 Preliminary
此题比较简单,就是找到其中最短的一个字符串(要是最短字符串都没有合适条件的子串,那就不可能含有子串了),然后按照其长度从len到0开始枚举所有子串,一旦找到合适的子串,则退出,此时的长度就是答案啦
代码:
#include<stdio.h>
#include<string.h>
void Strrev(char s[102])
{
char s1[102];
int i,k;
strcpy(s1,s);
k=0;
for(i=strlen(s)-1;i>=0;i--)
s[k++]=s1[i];
s[k]=0;
}
int main()
{
char str[102][102],name[102];
int t,n,i,j,q,l,s,len,min,k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);getchar();
min=102;
for(i=0;i<n;i++)
{
gets(str[i]);
len=strlen(str[i]);
if(len<min)
{
min=len;
k=i;
}
}
for(j=min;j>=0;j--)
{
for(i=0;i<=min-j;i++)
{
q=0;
for(l=i;l<i+j;l++)
name[q++]=str[k][l];
name[q]=0;
for(s=0;s<n;s++)
if(strstr(str[s],name)==NULL)
{
Strrev(name);
if(strstr(str[s],name)==NULL)
break;
}
if(s==n)break;
Strrev(name);
}
if(i<=min-j)break;
}
if(j>=0)printf("%d\n",j);
}
return 0;
}
此题比较简单,就是找到其中最短的一个字符串(要是最短字符串都没有合适条件的子串,那就不可能含有子串了),然后按照其长度从len到0开始枚举所有子串,一旦找到合适的子串,则退出,此时的长度就是答案啦
代码:
#include<stdio.h>
#include<string.h>
void Strrev(char s[102])
{
}
int main()
{
}