洛谷-P6832 [Cnoi2020]子弦-题解
题目描述
Cirno 有一个字符串 S,并希望你能求出 S 出现次数最多的非空子串的出现次数,记作p。
输入格式
一行,一个字符串 S。
输出格式
一行,一个整数 p。
输入输出样例
输入 #1
abababab
输出 #1
4
名词解释
子串:字符串中任意个连续的字符组成的子序列称为该串的子串。
第一次遇到这种类型的题,乍一看,确实很吓人。 (尤其像我这样的蒟蒻)
其实,仔细想一下,就会发现一个有意思的现象
- 样例1:abababab。输出的4是指a的数量。
- abcabcaa 输出4-a
- abcabcbc 输出3-bc
到这……我相信你一定 看出了一点小规律。
规律是啥呢?
如果最多的字串是单字符的,那么结果就是最多的字符的数量(如样例1)
如果最多的字串是双字符,那么这两个构成字串的字符,肯定大于等于每个字符的数量吧?比如上面第三个例子:b和c的次数大于a的次数。
如果是多字符子串呢?其实原理跟双字符字串一样。多字符字串最多,那么这个字串里肯定有一个字符是最多的(最多指大于等于其他字符的数量),如果外部的一个字符大于这个字串里的max字符,那么答案不是这个多字符字串了
相信你看完我这段毫无逻辑的话语,一定明白了我的意思!
这题就可以简化为找出现最多的那个字符,积累它的数量,并输出
#include<iostream>
#include<string>
#include<algorithm>//快排头文件
using namespace std;
long long book[27];//book数组做计数作用,记录每个字符出现的次数
int main ()
{
string n;
cin >> n;
long long len = n.length ();
for ( long long i = 0; i < n.length (); i++ )
book[n[i] - 'a']++;
sort ( book, book+26 );//找出最大的那个字符
cout << book[25] << endl;
return 0;
}
如果有更简单的思路,或者我这篇题解有什么瑕疵,欢迎大佬不吝赐教。