Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6823 Accepted Submission(s): 3053
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
23ABCDBCDFFBRCD2roseorchid
Sample Output
22
Author
Asia 2002, Tehran (Iran), Preliminary
这道题目,可以用搜索来做。
我用的是string.h几个函数。
strcpy:
char * strcpy(char * strDest,const char * strSrc);
就是将后面的数组赋给前面。如果前面数组长度不够大,运行崩溃。
strncpy:
char
*
strncpy
(
char
*dest,
char
*src,size_tnum);
这个与strcpy差别在于,它可以控制长度,当然这两者都可以通过控制
第二个数组的头位置来控制赋值起点。
strlen:
extern unsigned int strlen(char *s);
这个就是返回s数组长度(不包括'\0')
strstr:
extern char *strstr(const char *str1, const char *str2);
这个函数就是查找str2在str1中的位置,若不存在返回NULL。
仅这四个函数,即可解这道题。
/**************************************
***************************************
* Author:Tree *
*From :http://blog.csdn.net/lttree *
* Title : Substrings *
*Source: hdu 1238 *
* Hint : 串的处理 *
***************************************
**************************************/
#include <stdio.h>
#include <string.h>
char str[101][101];
int n;
int find_str(int len,int index)
{
char s[101],pos[101],inv[101];
bool flag;
int i,j,l;
//将字符串拷贝出来
strcpy(s,str[index]);
l=len;
// 舍弃后面的
while(l>0)
{
flag = 0;
for(i = 0; i <= len-l; ++i)
{
flag=1;//flag初始化为1
//正向字符串,将str中第i个位置,取l长度(舍弃前面的)
strncpy(pos,s+i,l);
//inv 为pos的逆序
for(j=0; j<l; j++)
inv[j]=pos[l-j-1];
// 字符数组,最后\0,防止某些不必要的冲突
pos[l]=inv[l] ='\0';
for(j=0; j<n; j++)
{
if(strstr(str[j],pos)==NULL&&strstr(str[j],inv)==NULL)
{flag=0;break;}
}
if(flag) break;
}
if(flag) break;
--l;
}
return l;
}
int main()
{
int i,t,min_len,index;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
min_len = 101;
for(i = 0; i < n; i++)
{
scanf("%s",str[i]);
//找到最短的字符串
if(strlen(str[i])<min_len)
{
min_len = strlen(str[i]);//记录最短字串的长度
index = i;//记录最短字串的位置
}
}
printf("%d\n",find_str(min_len,index));
}
return 0;
}