AC
题中的优先级:次数最多 > 长度最长 > 出现最早
当有多个次数最多的子串时,需要最长的子串。我们可以从最长的子串开始枚举,只在次数更大的情况下才更新 ans。
而当它们的长度相同时,因为是从左到右枚举子串的,所以 ans 一定是最早的。
比如
3
abcabcxyzxyz
abc 和 xyz 子串次数都是最大的,且长度相同,由于先遇到的是 abs,所以 ans 始终存放的是 abc,并不会存放 xyz。
#include <iostream>
using namespace std;
int main() {
int L;
string S;
cin >> L >> S;
int max_cnt = 0;
string ans;
//子串最长为 S.size(),最小为 L
for (int sub_len = S.size(); sub_len >= L; --sub_len) {
//从 start 位置开始的子串
for (int start = 0; start < S.size() - sub_len; ++start) {
string sub = S.substr(start, sub_len);
int cnt = 0;
//遍历后面子串,对该子串的出现次数计数,dis 表示与 start 的距离,因为也要把自己记上,所以从 0 开始
for (int dis = 0; start + dis < S.size() - sub_len; ++dis)
if (sub == S.substr(start + dis, sub_len)) ++cnt;
if (cnt > max_cnt) {
max_cnt = cnt;
ans = sub;
}
}
}
cout << ans;
return 0;
}