UVA902 【Password Search】
题目大意:给出一个整数\(n(0<n\leq10)\)和一个字符串,求出现次数最多的长度为\(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 << '\n';
rhs.clear(); // 多测一定要记得清空!!
}
return 0;
}