nyoj 308 Substring

Substring

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述

You are given a string input. You are to find the longest substring of input such that the reversal of the substring is also a substring of input. In case of a tie, return the string that occurs earliest in input. 

Note well: The substring and its reversal may overlap partially or completely. The entire original string is itself a valid substring . The best we can do is find a one character substring, so we implement the tie-breaker rule of taking the earliest one first.

输入
The first line of input gives a single integer, 1 ≤ N ≤ 10, the number of test cases. Then follow, for each test case, a line containing between 1 and 50 characters, inclusive. Each character of input will be an uppercase letter ('A'-'Z').
输出
Output for each test case the longest substring of input such that the reversal of the substring is also a substring of input
样例输入
3                   
ABCABA
XYZ
XCVCX
样例输出
ABA
X
XCVCX
刚开始做的时候,英语没有理解清楚,做成求最长回文串了,wa了一次
又读了一下题目意思,以后还是认真仔细点吧
题目意思:
在给出的字符串中找到一个最长子串,条件是其子串的逆串也出现在字符串中

因为字符串最长为50,直接暴力

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

char s1[55];
char s2[55];
char s3[55];
char s4[55];

int main(){
    int i,j,k,t,n,Max,len,l;
    scanf("%d",&t);
    while(t--){
        Max=-1;
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        scanf("%s",s1);
        len=strlen(s1);
        for(i=0,j=len-1;i<len;i++,j--)
            s2[j]=s1[i];
        if(!strcmp(s1,s2)){
            printf("%s\n",s1);
            continue;
        }
        Max=-1;
        for(i=0;i<len;i++){
            for(j=1;j<=len;j++){
                l=0;
                memset(s3,0,sizeof(s3));
                for(k=i;k<j;k++){
                    s3[l++]=s1[k];
                }
                if(strstr(s2,s3)&&l>Max){
                    Max=l;
                    strcpy(s4,s3);
                }
            }
        }
        printf("%s\n",s4);
    }
    return 0;
}


你可能感兴趣的:(nyoj 308 Substring)