zoukankan      html  css  js  c++  java
  • 汕头市队赛 SRM 08 A

    比赛没参加 所以回来补题咯 A还是自己YY出来了的 可惜比赛没有打

    描述

    给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T。

    这里的出现定义为存在一串下标 a_1,a_2,...,a_m,满足 a_1<a_2<...<a_m 且 S_{a_i}=T_i

    输入格式

    一行,一个 01 串

    输出格式

    一行,字母 Y 表示存在,N 表示不存在

    样例输入 1

    000

    样例输出 1

    N

    样例输入 2

    010

    样例输出 2

    Y

    数据范围与约定

    • 设串 S 的长度为 n,2leq nleq 5000
    • 数据为随机生成

    样例解释

    第一个样例中,"000"出现了一次([1+2+3]),"00"出现了三次([1+2],[2+3],[1+3]),"0"出现了三次([1],[2],[3])

    第二个样例中,"0"出现了两次

    这道题肯定先特判一波 1 和 0 是否只出现了2次 这是唯一一个T能由单一的1或者0组成的情况

    那么以下 1 0 不存在出现两次的情况了

    然后两个T肯定只有一个位置是不一样的 因为只有这样才会只有两个不一样

    那么我们考虑相邻的两个数 (设为 2 3)

    1. 如果两数相等 那么

    如果1或者4 和他们相等 那么这四个数组成的情况 出现相同的只会是1种或者2种以上

    比如 1110 可能的情况只有 选 1110(1种)或者110(3种) 10(3种)不存在两种的情况

    那么按题目要求 我们肯定是选那种一种的情况 以期待后面有两种的情况

    如果1 和 4 都和 2 3 不等 那么只有两种情况

    1001 0110 这个时候 只要你前后全部选 肯定就有答案了(这个是我瞎jb猜的)

    2 如果两数不等 同理也是不存在两种的情况 然后就可以写了啦

    其实以上的结论都是我猜的 证明什么的可能也不是很好 多多见谅 其实跑得挺快的哈

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    const int M=5007;
    char s[M];
    int cnt,c[M],w[M];
    bool f;
    int main()
    {
        scanf("%s",s+1);
        cnt=strlen(s+1);
        for(int i=1;i<=cnt;i++) c[i]=s[i]-'0',w[c[i]]++;
        if(w[0]==2||w[1]==2){printf("Y
    "); return 0;}
        c[0]=c[cnt+1]=-1;
        for(int i=1;i<cnt;i++)
         if(c[i]==c[i+1]&&c[i-1]!=c[i]&&c[i+1]!=c[i+2]) f=1;
        if(f) printf("Y
    ");
        else printf("N
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    获取当前时区时间
    python lambda表达式详解
    Odoo 12开发之开发环境准备
    初步了解odoo12
    web前端面试题
    实现一个优先级队列
    面试题
    python读取和生成excel文件
    Django基础
    virtualenv
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7242673.html
Copyright © 2011-2022 走看看