题目大意:给出一个整数(n(0<nleq10))和一个字符串,求出现次数最多的长度为(n)的子串。
我们分析一下这道题的算法:(hash,~AC)自动机(.)
此外,某机房大佬说(SAM)也可搞。
但蒟蒻窝实在是太菜了(……)以上算法基本都不会,所以我们采用(map)映射来记录每个子串出现的次数,最后直接一遍扫过去更新答案即可。
此外要注意当(n)大于字符串长度时,不需要映射。
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
map<string, int>rhs;
map<string, int>::iterator it; // 定义迭代器,后面扫的时候要用到。
int n;
string s, temp, ans; // s为题目给出的字符串,temp储存子串,ans储存答案
int main()
{
while (cin >> n >> s) {
int len = s.length();
if (n < len) { // 特判
for (int i = 0; i <= len - n; i++) {
temp = s.substr(i, n); // 使用substr函数直接取出从i开始长度为n的子串
rhs[temp]++;
}
}
int MAX = 0;
for (it = rhs.begin(); it != rhs.end(); it++) {
if (it -> second > MAX) { // it -> second 即 it 所指位置的子串出现的次数
ans = it -> first; // it -> first 即 it 所指位置的子串
MAX = it -> second; // 更新最大次数
}
}
cout << ans << '
';
rhs.clear(); // 多测一定要记得清空!!
}
return 0;
}