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;

   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] 

你可能感兴趣的:(acm)