poj百炼 2744:子串

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


ABCD 
BCDFF 
BRCD 
2
rose 
orchid
Sample Output



thinking:这题要用到几个字符串函数,但在百炼上貌似不能用revstr,这个只有自己写函数。
1,要从一组字符串中找到最短的一个字符;
2,从这个字符串中遍历找子串,从最长的慢慢到最短的;
3,如果这个子串或反序后是其余字符串的子串,则输出它的长度;
注意:如果没有子串,一定要输出0;

C++语言 ac代码
#include
#include

void  Strrev( char  (&x)[ 110],  char(&revx)[ 110])      //反序字符串函数;
{
    int  l;
    int  i;

    strlen(x);
    for(i= 0i
    {
        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= 0i
        {
            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> 0i--,j++)
        {
            for(k= 0k<=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= 0l
                {
                    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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值