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

猜你喜欢

转载自www.cnblogs.com/Hydrogen-Helium/p/11738047.html
今日推荐