单测试点时限: 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;
}