[SRM] 08 A

SRM:机房内部竞赛,哼唧。

 

描述

给一个 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"出现了两次

 

分析

我不是在刷牙的时候想出来的。

经过我漫长的Steam之旅,我得到以下结论:这样的一个01串,当以下两种情况发生时很大几率可以符合题目要求:

A. 含有至少一个纯区间(0000000...或者1111111...)长度为2

B. 含有至少两个同内容的长度为一的纯区间

解释:纯区间就是,,,000011110000000中有三个纯区间,分别是0000 1111 0000000。

 

代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define maxn 10086
 5 using namespace std;
 6 
 7 char ctr = 0;
 8 char str[maxn];
 9 int StrCou[3][maxn]; // StrCou[mode][len]
10 int JStringCou,OStringCou,StringCou,ACou,BCou,Cou;
11 int len;
12 
13 int main(){
14     scanf("%s",str);
15     len = strlen(str);
16     
17     ACou = 1;
18     StringCou = 1;
19     Cou = 1;
20     
21     for(int i = 1;i < len;i++){
22         if(str[i] != str[i-1]){
23             StrCou[StringCou%2][Cou]++;
24             StrCou[2][Cou]++; 
25             Cou = 0;
26             
27             StringCou++;
28         }
29         
30         Cou++;
31         
32         if(StringCou%2) ACou++;
33         else BCou++;
34     }
35     
36     StrCou[StringCou%2][Cou]++;
37     StrCou[2][Cou]++;
38     Cou = 0;
39     
40     bool flag = false;
41     
42     if(StrCou[2][2]) flag = true;
43     if(StrCou[0][1] >= 2 || StrCou[1][1] >= 2) flag = true;
44     
45     if(flag) printf("Y");
46     else printf("N");
47     
48     return 0;
49 }
推荐不看

 

posted @ 2017-07-27 00:06  Leviaton  阅读(202)  评论(0编辑  收藏  举报