ZOJ 3818 Pretty Poem 模拟题

这题在比赛的时候WA到写不出来,也有判断ABC子串不一样不过写的很差一直WA

在整理清思路后重写一遍3Y

解题思路如下:

第一种情况:ABABA。 先判断开头的A与结尾的A,得到A的长度,

接着判断ABAB 中的AB与AB是否相同(ABAB的长度一定为偶数)

已经知道了A长度,AB的长度 接着判断下A 与B是否相同

第二种情况:ABABCAB-可先讲AB看成整体即DDCD

若存在一个D满足条件 可得到C的长度和位置再判断A-B是否相同A-C是否相同 B-C是否相同(暴力取A的长度咯)

 

其中在重写的时候WA的一个原因是这样的:

暴力A子串的长度的时候

for(int lena = 1; lena <= len / 3; ++lena){

这么写会导致WA

如果控制到位,这么写:

for(int lena = 1; lena <= (len - 2) / 3; ++lena){

就不会出现错误。

取D子串的时候也是同理。

 

看了别人写的代码,漫天飞舞的flag_1,flag_2,flag_3

还不如自己写一遍舒服多了

#include <stdio.h>
#include <string.h>

int main(){
    int n, i, j, k, t, m;
    char array[55], a[55];
    int len;
    bool flag_a, flag_b;
    scanf("%d",&t);
    while(t--){
        scanf("%s",array);
        len = 0;
        flag_a = flag_b = false;
        for(i = 0; i < strlen(array); ++i){
            if(array[i] >= 'A' && array[i] <= 'Z' || array[i] >= 'a' && array[i] <= 'z'){
                a[len++] = array[i];
            }
        }
        a[len] = '\0';
        for(int lena = 1; lena <= (len - 2) / 3; ++lena){
            bool flag_1 = false;
            for(i = 0; i < lena; ++i){
                if(a[i] != a[len - lena + i])
                    flag_1 = true;
            }
            if(flag_1)  continue;
            int remain_num = len - lena;
            if(remain_num % 2 != 0) continue;
            remain_num /= 2;
            for(i = 0; i < remain_num; ++i){
                if(a[i] != a[i + remain_num])
                    flag_1 = true;
            }
            if(flag_1)  continue;
            int lenb = remain_num - lena;
            if(lena == lenb){
                for(i = 0; i < lena; ++i){
                    if(a[i] != a[i + lena]){
                        flag_a = true;
                        break;
                    }
                }
                if(flag_a)  break;
            } else{
                flag_a = true;
                break;
            }
        }
        for(int lend = 2; lend <= (len - 1) / 3; ++lend){
            bool flag_2 = false;
            for(i = 0; i < lend; ++i){
                if(!(a[i] == a[i + lend] && a[i] == a[len - lend + i]))
                    flag_2 = true;
            }
            if(flag_2)  continue;
            int lenc = len - 3 * lend;
            bool a_b = false;
            for(int lena = 1; lena < lend; ++lena){
                if(lena == lend - lena){
                    for(i = 0; i < lena; ++i){
                        if(a[i] != a[lena + i])
                            a_b = true;
                    }
                    if(!a_b)    continue;
                }
                bool a_c = false;
                bool b_c = false;
                if(lena != lenc)    a_c = true;
                else{
                    for(i = 0; i < lena; ++i){
                        if(a[i] != a[2 * lend + i]){
                            a_c = true;
                            break;
                        }
                    }
                }
                int lenb = lend - lena;
                if(lenb != lenc)    b_c = true;
                else{
                    for(i = 0; i < lenb; ++i){
                        if(a[lena + i] != a[2 * lend + i]){
                            b_c = true;
                            break;
                        }
                    }
                }
                if(a_c && b_c){
                    flag_b = true;
                    break;
                }
            }
            if(flag_b){
                break;
            }

        }

        if(flag_a || flag_b){
            printf("Yes\n");
        } else{
            printf("No\n");
        }
    }
    return 0;
}

 

posted @ 2014-09-11 11:45  Jeremy Wu  阅读(200)  评论(0)    收藏  举报