潍坊学院第四届acm程序设计竞赛I题(Bob的难题)

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;
}

  

posted @ 2019-12-08 18:58  陈墨cacm  阅读(418)  评论(0编辑  收藏  举报