zoj3818 - Pretty Poem
题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5350
给你一句诗(大小写敏感的字符串),问是否满足ABABA || ABABVAB 的形式,A B V 是三个不同字符串
首先: ABABABAB属于ABABVAB形式,A B V 真的是有一点不同就可以!
其次,不要想得太复杂,我居然想用KMP,我觉得我都要哭了,这说明,有的时候我们真的将问题复杂化了!
最后我的做法: 先找出CCD形式的,然后判断D长度
case1:length(D) < length(AB) , 判断 D是否为 C子串,是则 D 就 是 A ,不是就直接跳过。最后判断一下 A B 是否相等。
case2:length(D) > length(AB), 判断最后length(AB)长的字符串是否等于AB,不等直接跳过。最后枚举A B 再判断 D-AB字符串和 A B 的关系,不等就是满足。
代码如下:
#include
#include
#include
#include
using namespace std;
int T;
char ss[66] ,a[66] , b[66] , c[66] ;
int getresult( int length )
{
int i,j,k,lengtha,lengthb,lengthc ;
char geta ;
for( i = 2 ; i < length/2 + 1 ; i++ ){
strncpy( a , ss , i );
a[i] = '\0' ;
//printf("a:%s\n",a);
strncpy( b , ss+i , i );
b[i] = '\0' ;
//printf("b:%s\n",b);
/** 先找出CCD形式的,然后判断D长度*/
if(strcmp( a , b ) != 0){
continue ;
}
k = length - 2*i ;
/**
*case1:length(D) < length(AB) ,
*/
if( k < i && k ){
strncpy( c , ss+2*i , k );
c[k] = '\0';
//printf("c:%s\n",c);
/**
*判断 c是否为 AB子串,是则 c 就 是 A ,不是就直接跳过。最后判断一下 A B 是否相等。
*/
if(strncmp( a , c , k )!=0){
continue ;
}
lengthb = 3*i - length ;
strncpy( b , a+k , lengthb );
b[lengthb]='\0';
a[k]='\0';
if(strcmp(a,b)!=0){
return 1;
}
}
/**
*case2:length(D) > length(AB)
*/
else if( k > i ){
/**
*判断最后length(AB)长的字符串是否等于AB,不等直接跳过。
*/
strncpy( c , ss+length-i , i );
c[i] = '\0';
//printf("c:%s\n",c);
if( strcmp( a , c ) != 0 ){
continue;
}
lengthc = length - 3*i ;
strncpy( c , ss+2*i , lengthc ) ;
c[lengthc] = '\0' ;
//printf("CC:%s\n",c);
/**
*最后枚举A B 再判断 D-AB字符串和 A B 的关系,不等就是满足
*/
for( j = 1 ; j < i ; j ++ ){
strncpy( b , a+j , i-j );
geta = a[j];
b[i-j] = '\0'; a[j] = '\0';
if( strcmp( a , b ) == 0 ){
a[j] = geta ; continue ;
}
if( strcmp( a , c ) != 0 && strcmp( b , c ) != 0 ){
return 1;
}
a[j] = geta ;/**置回很重要!*/
}
}
}
return 0 ;
}
int main()
{
char getin ;
int i ,len ,flag ;
scanf( "%d%*c" , &T );
while ( T-- )
{
i = 0 ; flag = 0 ;
while(1)
{///无特殊符号输入
getin = getchar();
if( getin == '\n' )
{
ss[i] = '\0';
break;
}
if( getin>='a' && getin <='z' || getin >='A' && getin<='Z')
{
ss[i++] = getin ;
}
}
len = i ;
if( len < 5 ){
printf("No\n");continue;
}
flag = getresult( len );
if( flag )
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}