Bob的难题
Description
Bob 有一个字符串s,但是他并不知道s具体是什么,他只知道s是由小写英文字母组成。现在定义一个字符串s′,s′是把s中所有的小写英文字母"a"去掉(其它字母的前后顺序保持不变)。此时Bob利用计算机产生了一个新的字符串T,T是由s和s′相连的,换句话说T=s+s′(s必须在s′前面)。
给你一个字符串T,你的任务是寻找一个字符串s满足给定的条件。如果可以找到,它将是唯一的。
Input
输入只有一行。输入一个只由小写英文字母组成的字符串T,T的长度不超过100000。
Output
输出只有一行。如果找到字符串s,输出一个字符串s;否则,输出 ":(" (没有引号);
数据范围:
T的长度∈[1,100000]
Sample Input 1
aaaaa
Sample Output 1
aaaaa
Sample Input 2
aacaababc
Sample Output 2
:(
Sample Input 3
ababacacbbcc
Sample Output 3
ababacac
Sample Input 4
baba
Sample Output 4
:(
Hint
第一个样例,s="aaaaa",s′="" 。
第二个样例,没有找到s 。
第三个样例,s="ababacac",s′="bbcc"。
第四个样例,没有找到s 。
积累的经验:第一次交超时,为什么呢,因为程序中,我用了大量的strlen,而没有直接设置一个值int让他等于strlen
然后再交还是错,因为ans没有初始化为0,因为ans记录的是a在字符串中的位置,当样例bb的时候,因为ans没初始化,所以ans的值千奇百怪,造成wa
这次教训印象深刻,总的来说还是自己太菜了。一些小习惯没培养好
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; char a[N],b[N]; int main() { scanf("%s",a); int cnt = 0; int ans = 0; int x = strlen(a); for(int i = 0; i < x; i++) { if(a[i] != 'a') { b[cnt++] = a[i]; } else { ans = i; } } if((cnt % 2 != 0) || (ans >= x-(cnt/2))) { printf(":("); } else{ for(int i = 0; i < cnt/2; i++) { if(b[i] != b[(cnt/2)+i]) { printf(":("); return 0; } } for(int i = 0; i < x-(cnt/2); i++) { printf("%c",a[i]); } } return 0; }