Always keep a beginner'|

Creeper_l

园龄:1年4个月粉丝:10关注:13

P9016 [USACO23JAN] Find and Replace G 题解

可以把从每个字符开始的操作过程看成是一棵树,对于每一个字符我们都维护一颗树(表示从这个字符开始操作的过程)。因为后面的操作会覆盖掉前面的,所以我们考虑从最后面的操作开始往上建树。首先 \(a-z\) 都指向自己(因为自己如果不变的话值还是自己),对于每一次操作 \((x,s)\)。我们可以依次合并 \(s_{i-1},s_i\)。合并的过程为:建立一个新点(这个点不代表一个字符,可以设为任意字符),左儿子是 \(s_{i-1}\) 这个字符所表示的树,左儿子是 \(s_{i}\) 这个字符所表示的树。一直合并到 \(s_n\) 为止。最后将字符 \(x\) 所代表的树变为这颗合并完的树。

考虑如何查询答案,我们可以用类似于线段树的方式。对于每一个节点记录一个 \(size\) 表示这个子树内有多少个字符。然后通过 \(size\)\(l,r\) 的大小关系判断应该遍历左区间还是右区间即可。

时间复杂度:因为 \(\sum s \le 200000\),所以建树的时间复杂度是 \(O(n)\) 的。又因为这是一颗二叉树,且最后查询的区间大小(叶子节点个数)是 \(r-l+1=O(n)\) 的,所以查询的时间复杂度也是 \(O(n)\) 的,总时间复杂度 \(O(n)\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 8e5 + 10;
const int inf = 1000000000000000000;
int l,r,q,root[MAXN],tot;
char a[MAXN],x;
string b[MAXN],s;
struct Node{int ls,rs,size;char c;}tree[MAXN]; 
inline void solve(int id,int l,int r)
{
	if(r <= 0 || l > tree[id].size) return;
	if(tree[id].c == '#') 
	{
		solve(tree[id].ls,l,r);
		solve(tree[id].rs,l - tree[tree[id].ls].size,r - tree[tree[id].ls].size);	
	}
	else cout << tree[id].c;
}
signed main()
{
	cin >> l >> r >> q;
	for(int i = 0;i < 26;i++) tree[i] = {i,i,1,char(i + 'a')},root[i] = i;
	tot = 25;
	for(int i = 1;i <= q;i++) cin >> a[i] >> b[i];
	for(int i = q;i >= 1;i--)
	{
		x = a[i],s = b[i];
		int p = root[s[0] - 'a'];
		for(int i = 1;i < s.length();i++)
		{
			int F = s[i] - 'a';
			tree[++tot] = {p,root[F],min(inf,tree[p].size + tree[root[F]].size),'#'}; 
			p = tot;
		}
		root[x - 'a'] = p; 
	}
	solve(root[0],l,r);
	return 0;
}

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/17969051

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(25)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
Endless Summer - Alan Walker / Zak Abel
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起