您的位置:首页 > 其它

poj百炼 2744:子串

2014-01-08 01:45 330 查看
总Time Limit:
1000ms
Memory Limit:
65536kBDescription现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。
Input
输入的第一行是一个整数t (1 <= t <=
10),t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <=
100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1和100之间的字符串。
Output
对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。
Sample Input
2

3

ABCD

BCDFF

BRCD

2

rose

orchid

Sample Output
2

2


thinking:这题要用到几个字符串函数,但在百炼上貌似不能用revstr,这个只有自己写函数。

1,要从一组字符串中找到最短的一个字符;

2,从这个字符串中遍历找子串,从最长的慢慢到最短的;

3,如果这个子串或反序后是其余字符串的子串,则输出它的长度;

注意:如果没有子串,一定要输出0;

C++语言: ac代码#include#includevoid Strrev(char (&x)[110], char(&revx)[110])   //反序字符串函数;{int l;int i;l = strlen(x);for(i=0; i{revx[i] = x[l-1-i];}}int main(){char str[110][110];
//储存字符串数组;int i;int j;int k;int l;int t;int n;scanf("%d", &t);while (t--){int flag;//标记是否找到;char x[110] = {0};//储存最长子串;char revx[110] = {0};//储存最短子串的反序串;char min_str[110] = {0}; //储存短的字符串;int min_length = 110;//最短字符串的长度;scanf("%d", &n);for(i=0; i{scanf("%s", str[i]);//寻找最短的字符串;if(strlen(str[i]) < min_length){min_length = strlen(str[i]);strcpy(min_str, str[i]);}}j=0;for(i=min_length; i>0; i--,j++){for(k=0; k<=j; k++){strncpy(x, min_str+k, i);strncpy(revx, min_str+k, i);revx[i] = x[i] = '\0';Strrev(x, revx);flag = 1;for(l=0; l{if(strstr(str[l], x)==NULL&&strstr(str[l], revx)==NULL){flag = 0;break;}}if(flag==1){printf("%d\n", i);break;}}if(flag==1)break;}if(flag==0)printf("0\n");}return 0;}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: