牛客网题目链接
直接暴力,用map函数存每个子串出现的次数,子串的类型使用两层循环遍历。
注意字符串的边界问题,这里需要排序所以直接用map
版本1
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cctype>
#include <unordered_map>
#include <map>
using namespace std;
const int N = 105;
typedef pair<int, string> PII;
int main(){
string str;
while(cin>>str){
map<string, int> mp;
for(int i = 0; i < str.size(); i++){
for(int j = i+1; j <= str.size(); j++){
string t = str.substr(i, j-i);
mp[t]++;
}
}
for(auto x: mp){
if(x.second > 1)
cout<<x.first<<" "<<x.second<<endl;
}
}
return 0;
}
版本2
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
map<string, int> mp;
while(cin>>str){
mp.clear();
for(int i=0; i<str.size(); i++){
for(int j=i; j<str.size();j++){
string s;
for(int k=i; k<=j;k++){ //注意这里要取等号
s += str[k];
}
mp[s]++;
}
}
for(auto it: mp){
if(it.second > 1){
cout<<it.first<<" "<<it.second<<endl;
}
}
}
return 0;
}