为什么https://www.luogu.com.cn/blog/2010-05-02/solution-cf977b 没有过,原因是 LaTeX 公式/英文与汉字之间少空格;
[原题传送门](https://codeforces.com/problemset/problem/977/B)
一道模拟题,然鹅我调了好久,是set的问题。
注:以下子串均指长度为2的子串
## 思路1
直接暴力,遇到每一个子串,都重新遍历一遍,判断与它相等的子串数量数量cnt,再用cnt和已有的max比较,时间复杂度 $\mathcal O (n^2)$,由于字符串长度最长100,此解能过得去。
(这里就不放代码了)
## 思路2
利用[map](https://www.w3cschool.cn/cpp/cpp-fu8l2ppt.html)和[vector](https://www.w3cschool.cn/cpp/cpp-i6da2pq0.html)(数组也行),用map储存每个子串的数量,vector储存每个子串,
vector<string> v;
map<string,int> mp;
然后再遍历字符串以获取每个子串以及和它相同的字串数量,
for(int i=0;i<n-1;i++){
string x=str.substr(i,2);
v.push_back(x);
mp[x]++;
}
再通过map和vector算出每个子串(指一个子串及与它相等的子串)出现的数量即可。
for(int i=0;i<n-1;i++){
string x=v[i];
if(mp[x]>mx)ans=v[i];
mx=max(mx,mp[x]);
}
cout<<ans;
时间复杂度 $\mathcal O (n)$。
## 思路3
同思路2,将vector改为set去重,稍快一点,但时间复杂度没变,而且set容易写错,故不推荐。
### The end.