【思维构造】Cow and Message—CF1307C

Cow and Message---CF1307C

思路

看清题意!看清题意!看清题意!(重要事情说三遍)

一开始没看清题,以为要求的是所有下标呈等差数列的子串的总数,一直不知道怎么做。

后来看了题解才发现要求的是"所有下标呈等差数列的子串中哪个子串出现的次数最多"。

为了方便,下边称"下标呈等差数列的子串"为"满足条件的子串"。

弄明白了题意,我们现在只需要知道点就能做出来这道题了:满足条件的子串的长度一定是 1 1 1 或 2 2 2。

证明:

假设 s t r str str 是一个满足条件的子串,其中 s t r = a b c d e f g str~=~abcdefg str = abcdefg,那么 s t r str str 出现的次数一定 ≤ \le ≤ " a b " "ab" "ab" 出现的次数。

也就是说,任何一个满长度大于 2 2 2 的满足条件的子串出现的次数一定 ≤ \le ≤ 这个子串的任意一个长度为 2 2 2 的子序列出现的次数,这一点很好理解。原猜想得证。

C o d e Code Code

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;

int n;

void solve(int Case) {
	string s; cin >> s;
	n = sz(s);
	s = " " + s;
	
	int res = 0;
	vector <int> num(27, 0);
	int ans[27][27] = {0};
	for (int i = 1; i <= n; i ++) {
		int ed = s[i] - 'a' + 1;
		for (int bg = 1; bg <= 26; bg ++) {
			ans[bg][ed] += num[bg];
			res = max(res, ans[bg][ed]);
		}
		num[s[i] - 'a' + 1] ++;
		res = max(res, num[s[i] - 'a' + 1]);
	}
	
	cout << "        ";
	cout << res << "\n";
}

signed main() {
	cin.tie(0)->ios::sync_with_stdio(false);
	int T = 1;
//	cin >> T; cin.get();
	int Case = 0;
	while (++ Case <= T) solve(Case);
	return 0;
}
相关推荐
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之字符串 --【子串查找】:[NOIP 2009 提高组] 潜伏者
c++·字符串·csp·高频考点·信奥赛·子串查找·潜伏者
初願致夕霞8 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
小小de风呀9 小时前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
CHANG_THE_WORLD11 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
螺丝钉的扭矩一瞬间产生高能蛋白12 小时前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
智者知已应修善业12 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
智者知已应修善业12 小时前
【51单片机如何让LED灯从一亮到八,再从八亮到一】2023-10-13
c++·经验分享·笔记·算法·51单片机
qeen8712 小时前
【数据结构】二叉树相关经典函数C语言实现
c语言·数据结构·c++·笔记·学习·算法·二叉树
良木生香13 小时前
【C++初阶】STL——List从入门到应用完全指南(1)
开发语言·数据结构·c++·程序人生·算法·蓝桥杯·学习方法