首页 > 其他分享 >CSP-S 2023 消消乐

CSP-S 2023 消消乐

时间:2023-10-29 20:46:37浏览次数:28  
标签:typedef int long 消消 maxn 出边 2023 CSP define

洛谷传送门

考虑 dp,设 \(f_i\) 为以 \(i\) 结尾的合法子串个数。如果我们能对每个 \(i\),求出来 \(g_i\) 表示最大的左端点 \(l\) 使得 \([l, i]\) 是合法串,那么 \(f_i = f_{g_i - 1} + 1\)。若 \(g_i\) 不存在则 \(f_i = 0\)。答案为 \(\sum\limits_{i = 1}^n f_i\)。

考虑求 \(g_i\)。因为 \(g_i\) 是最大的,所以 \(s_{g_i} = s_i\),并且 \([g_i + 1, i - 1]\) 是由若干个 \([g_i, i]\) 组成的合法串拼接而成。

这启发我们连边 \(i \to g_i - 1\),转化成求 \(i\) 不断跳出边直到跳到字符 \(s_i\) 或没有出边,并找到跳到的点。

套路地考虑倍增,设 \(F_{i, j}\) 为点 \(i\) 跳了 \(2^j\) 次出边后所在的点,\(G_{i, j}\) 为点 \(i\) 跳了 \(2^j\) 次出边后,访问过的所有点(包括 \(i\),不包括 \(i\) 跳 \(2^j\) 次出边后所在的点),出现过的字符集合。由于 \(|\Sigma| = 26\),因此可以用一个 int 存储。

那么求 \(g_i\) 就只用跳到最后一个点 \(j\) 使得从 \(i\) 跳到 \(j\) 都不出现字符 \(s_i\),那么 \(j\) 往上跳一步就是我们想求的 \(g_i\)。

求出来 \(g_i\) 后,令 \(F_{i, 0} = g_i - 1, G_{i, 0} = \{s_i\}\),再更新倍增数组即可。

有若干细节,包括要特判 \(s_{i - 1} = s_i\) 以及 \(g_i\) 不存在。

时空复杂度均为 \(O(n \log n)\)。

code
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 2000100;
const int logn = 23;

int n, f[maxn][logn], g[maxn][logn];
ll h[maxn];
char s[maxn];

void solve() {
	scanf("%d%s", &n, s + 1);
	ll ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (i > 1 && s[i] == s[i - 1]) {
			h[i] = h[i - 2] + 1;
			ans += h[i];
			f[i][0] = i - 2;
			g[i][0] = (1 << (s[i] - 'a'));
			for (int j = 1; j < 21; ++j) {
				f[i][j] = f[f[i][j - 1]][j - 1];
				g[i][j] = g[i][j - 1] | g[f[i][j - 1]][j - 1];
			}
			continue;
		}
		int u = i - 1;
		for (int j = min(__lg(i) + 1, 20); ~j; --j) {
			if ((~g[u][j]) & (1 << (s[i] - 'a'))) {
				u = f[u][j];
			}
		}
		if (!u) {
			g[i][0] = (1 << (s[i] - 'a'));
			for (int j = 1; j < 21; ++j) {
				f[i][j] = f[f[i][j - 1]][j - 1];
				g[i][j] = g[i][j - 1] | g[f[i][j - 1]][j - 1];
			}
			continue;
		}
		--u;
		h[i] = h[u] + 1;
		ans += h[i];
		f[i][0] = u;
		g[i][0] = (1 << (s[i] - 'a'));
		for (int j = 1; j < 21; ++j) {
			f[i][j] = f[f[i][j - 1]][j - 1];
			g[i][j] = g[i][j - 1] | g[f[i][j - 1]][j - 1];
		}
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,int,long,消消,maxn,出边,2023,CSP,define
From: https://www.cnblogs.com/zltzlt-blog/p/17796413.html

相关文章

  • 2023-2024-1 20231419 《计算机基础与程序设计》第五周学习总结
    2023-2024-120231419《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05这个作业的目标预习《计算机科学概......
  • 2023-2024-1 20231404高伟光《计算机基础与程序设计》第5周学习总结
    作业信息属于课程2023-2024-1-计算机基础与程序设计作业要求要求作业目标Pep/9虚拟机,机器语言与汇编语言,算法与伪代码,测试:黑盒,白盒作业正文此博客教材学习内容总结计算机概论:明白了pep9的一些基本逻辑知道了汇编语言与机器语言的区别会写简单的伪代码......
  • 2023-2024-1 20231421 《计算机基础与程序设计》第五周学习总结
    ------------恢复内容开始------------------------恢复内容开始------------作业信息作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05作业目标:自学《计算机科学概论》第六章、《c语言程序设计》第四章作业正文:教材学习内容总结一、《计算机科学概论》第六......
  • 2023-2024-1 20231307 《计算机基础与程序设计》第5周学习总结
    2023-2024-120231307《计算机基础与程序设计》第5周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第5周作业)这个作业的目标<计算机科学概论第6章......
  • 2023-2024-1 学号20231315第五周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习计算机科学概论第6章和《C语言程序设计》第4......
  • # 学期2023-2024-1 20231401 《计算机基础与程序设计》第五周学习总结
    学期2023-2024-120231401《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第五周作业这个作业的目标自学教材:计算机科学概论第6章,C语言程序设计第4章并......
  • 2023数据采集与融合技术实践三
    2023数据采集与融合技术实践三作业1:要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。输出信息:将下载的Url信息在控制台输出,并将下载的图片存储在images子文件中,并给出截图。码......
  • 2023-2024-1 20231417 《计算机基础与程序设计》第五周学习总结
    2023-2024-120231417《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第五周作业这个作业的目标<关于机器语言与汇编语言,pep9的相关应用,循坏算法的了解与......
  • 2023年产业园区数字孪生规划方案:PPT全文40页,附下载​
    关键词:智慧园区解决方案,智慧园区综合管理系统,智慧园区管理平台,智慧园区建设规划方案,产业园区规划思路,产业园区解决方案,数字孪生解决方案一、智慧产业园区建设背景产业园区作为产业发展的重要载体,既是区域经济发展、产业调整升级的空间承载形式,又是地区社会经济发展水平的衡量标志,其......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记7
    学习笔记7顺序算法与并行算法线程的原理与优缺点线程管理函数线程同步实践过程顺序算法与并行算法顺序算法(SequentialAlgorithm)原理:顺序算法是一种线性执行的算法,它按照顺序一步一步地解决问题。这意味着每个操作都依赖于前一个操作的结果,只有在前一个操作完成之后才......