zoukankan      html  css  js  c++  java
  • 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] = '';
            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
    ");
            } else{
                printf("No
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Luogu3227 HNOI2013切糕
    Luogu1646 happiness
    Luogu5038 SCOI2012奇怪的游戏
    Luogu3324 星际战争
    Luogu2472 SCOI2007蜥蜴
    NOI Online#3 解题报告
    Luogu6478 游戏
    1,[VS入门教程] 使用Visual Studio写c语言 入门与技巧精品文~~~~下载安装篇
    Windows开机自动登陆 开/关:登录需按Ctrl+Alt+del的功能
    官方入门教程和文档 | Visual Studio
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3966134.html
Copyright © 2011-2022 走看看