[SRM] 08 A
SRM:机房内部竞赛,哼唧。
描述
给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T。
这里的出现定义为存在一串下标 ,满足 且 。
输入格式
一行,一个 01 串
输出格式
一行,字母 Y 表示存在,N 表示不存在
样例输入 1
000
样例输出 1
N
样例输入 2
010
样例输出 2
Y
数据范围与约定
- 设串 S 的长度为 n,
- 数据为随机生成
样例解释
第一个样例中,"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 }
转载请注明出处 -- 如有意见欢迎评论