汕头市队赛 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,2\leq n\leq 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\n"); 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\n");
    else printf("N\n");
    return 0;
}
View Code

 

posted @ 2017-07-27 00:11  友人Aqwq  阅读(196)  评论(1编辑  收藏  举报