cf.C. Cow and Message

题意:

给你一个字符串,让你找出其中出现最多次数的子串出现的次数。题目中所说的字串是等差数列的子串,也就是说下标应该是等差数列。
举个例子:
aaabb,其中a出现了3次,b出现了2次,aa3次,bb1次,ab6次,aaa1次,aab4次等等,所以输出应该是6
划重点:
不过仔细想想,你就会发现,子串是一个字母或者字串是两个字母的时候,无论位置怎样,他都符合等差数列这个要求。
你可能要问了,那两个以上的子串你为什么没有判断呢?因为两个以上的子串不可能出现答案,也就是次数最多。比如说出现最多次数的子串长度是3,那么这个字串里面长度是2的子串肯定至少出现相同的次数,所以说我们只要考虑长度为2的子串和长度为1的子串出现的最多次数即可。
因为后面出现的字母与前面出现的字母组成长度为2的字符串是相关联的,那就不难想到这道题来用dp求解。
b数组表示的是当前位置前面每个字母出现的次数
co数组则表示所有长度为2的字符串出现的次数
最后看不会超时,直接搜到最大次数输出即可
上代码:

#include<iostream>
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
string a;
long long int b[1000005][27],co[27][27],ans;
int main()
{
	cin >> a;
	for(int i = 0 ; i < a.length() ; i++)
	{
		b[i][a[i]-'a']++;
		for(int j = 0 ; j < 26 ; j++)
		   b[i+1][j]=b[i][j];
	}
	for(int i = 0 ; i < 26 ; i++)
	   ans=max(ans,b[a.length()][i]);
	for(int i = 0 ; i < a.length()-1 ; i++)
	{
		for(int j = 0 ; j < 26 ; j++)
		{
			co[j][a[i+1]-'a']+=b[i][j];
		} 
	}
//	int z1=0,z2=0;
	for(int i = 0 ; i < 26 ; i++)
	{
		for(int j = 0 ; j < 26 ; j++)
		{
//			if(co[i][j]>ans)
//			{
//				z1=i;
//				z2=j;
//			}
			ans = max(ans,co[i][j]);
		}
	}
	cout << ans << endl;
//	cout << z1 << ' ' << z2 << endl;
	return 0;
}
发布了107 篇原创文章 · 获赞 3 · 访问量 7109

猜你喜欢

转载自blog.csdn.net/qq_43504141/article/details/104373050
今日推荐