就是简单模拟题不要想复杂,A,B很小不需要优化,注意细节!
#include <iostream>
#include <unordered_map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
bool cmp(const string &s1, const string &s2){
if(s1.length() != s2.length()) return s1.length() < s2.length();
return s1 < s2;
}
int main()
{
unordered_map<string, int> mp;
ios::sync_with_stdio(false);
int A, B, N; cin >> A >> B >> N;
string s, temp;
while(cin >> temp){
s += temp;
}
for(int i = 0; i < s.length(); i ++ ){
string t;
for(int j = i; j < i + B && j < s.length(); j ++ ){
t += s[j];
if(t.length() >= A) mp[t] ++ ;
}
}
set<int> st;
vector<int> cnt;
unordered_map<int, vector<string>> res;
for(auto &[u, v] : mp){
st.insert(v);
res[v].push_back(u);
}
for(int v: st) cnt.push_back(v);
reverse(cnt.begin(), cnt.end());
for(int i = 0; i < N && i < cnt.size(); i ++ ){
int v = cnt[i];
vector<string> t = res[v];
sort(t.begin(), t.end(), cmp);
cout << v << endl;
for(int i = 0; i < t.size(); i ++ ){
if(i && i % 6 == 0) cout << endl;
cout << t[i] << " ";
}
cout << endl;
}
return 0;
}