zoj3818- Pretty Poem(爆枚型字符串题)

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;
}

      
      
     
     
    
    
   
   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值