洛谷-P6832 [Cnoi2020]子弦-题解

洛谷-P6832 [Cnoi2020]子弦-题解

题目描述

Cirno 有一个字符串 S,并希望你能求出 S 出现次数最多的非空子串的出现次数,记作p。

输入格式

一行,一个字符串 S。

输出格式

一行,一个整数 p。

输入输出样例

输入 #1

abababab

输出 #1

4

名词解释

子串:字符串中任意个连续的字符组成的子序列称为该串的子串。

第一次遇到这种类型的题,乍一看,确实很吓人。 (尤其像我这样的蒟蒻)
其实,仔细想一下,就会发现一个有意思的现象

  1. 样例1:abababab。输出的4是指a的数量。
  2. abcabcaa 输出4-a
  3. 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;
}

传送门:题目

如果有更简单的思路,或者我这篇题解有什么瑕疵,欢迎大佬不吝赐教。

猜你喜欢

转载自blog.csdn.net/weixin_51550966/article/details/111184930