求助题解
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/28 20:08
  • 上次更新2023/11/4 12:49:47
查看原帖
求助题解
349906
封禁用户楼主2021/7/28 20:08

为什么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.
2021/7/28 20:08
加载中...