编程挑战赛 Round #1 A. 子串问题

单测试点时限: 2.0 秒

内存限制: 512 MB

一个字符串 s 被称作另一个字符串 S 的子串,表示 s 在 S 中出现了。比如,“中出”是“我们中出了一个叛徒”的子串。注意子串和子序列是不同的:“苹机”是“苹果手机”的子序列,而不是子串。前缀和后缀是两种特殊的子串:一个前缀在原串的开始位置出现,而一个后缀在原串的末端出现。【本段摘自WiKi】

统计出现最多的子串,若有多个则输出ASCII码字典序最小的。

输入
多组输入,每组输入一行字符串,由大小写英文字母组成,并且可能包括 空格、,、. 这三种符号。数据所有输入字符串的长度总和不超过 106。

输出
输出该子串。

样例
input
Welcome To HPUOJ
output

提示
样例的输出子字符串为一个 空格,并非没有输出。
解题思路:就是只需要查询一个字母的次数就好了。注意不能只是简单的for循环嵌套。这样会超时。我们观察之后就会发现总共需要查询的字符就只有26+26+3个所以只需要对这几个字符标明状态就好了。

#include <iostream>
#include <string.h>

using namespace std;

const int MAX_N = 1e6 + 7;

char str[MAX_N], s;
bool flag[130];

int main () {
	while (gets(str)) {
		int len = strlen(str);
		int sun = 0, max = 0;
		s = str[0];
		for (int i = 0; i < 130; i++) flag[i] = 1;
		for (int i = 0; i < len; i++) {
			sun = 0;
			int a = str[i]; //printf ("%d\n", a);
			if (flag[a]) {
//				printf ("~~~~\n");
				flag[a] = 0;
				for (int j = 0; j < len; j++) {
					if (str[i] == str[j]) sun ++;
				}
			}
			if (max < sun) {
				s = str[i], max = sun;
//				printf ("%d %s\n", max, s);
			}
			else if (max == sun) {
				if (s > str[i]) s = str[i]; //printf ("%d %c\n", max, s);
			} 
		}
		printf ("%c\n", s);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值