比赛没参加 所以回来补题咯 A还是自己YY出来了的 可惜比赛没有打
描述
给一个 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"出现了两次
这道题肯定先特判一波 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; }