[bzoj5000][乱搞]OI树

2023-10-16 03:32
文章标签 乱搞 oi bzoj5000

本文主要是介绍[bzoj5000][乱搞]OI树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

几天之后小跳蚤即将结束自己在lydsy星球上的旅行。这时,lydsy人却发现他们的超空间传送装置的能量早在小跳
蚤通过石板来到lydsy星球时就已经消耗光了。这时,小跳蚤了解到自己很有可能回不到跳蚤国了,于是掉下了伤
心的眼泪……lydsy人见状决定无论如何也要送小跳蚤回地球,于是lydsy人的大祭司lavendir决定拜访lydsy星球
的OI树,用咒语从OI树中取得能量。咒语中有K种字母,我们用前K个大写英文字母来表示它。OI树可以被认为是一
个有着N个节点的带权有向图,所有节点的出度都是K,并且所有的出边都对应于一个咒语中的字母。仪式开始的时
候有一个标记物放在OI树的1号节点上。之后,从咒语的第一个字母开始,每经过一个字母,标记物就沿着该字母
对应的出边进入这条边的终点,并且得到相当于边权大小的能量值。当咒语处理完毕时,就可以得到这个过程中得
到的所有能量了。现在由于lydsy人超群的计算能力,他们已经知道某咒语大概会获得多少能量,只是还想知道会
获得的能量值对一个数M取模的结果。跳蚤国王通过小跳蚤留下的石板也了解到了小跳蚤现在的处境,所以他又找
到了你,希望你帮助他计算出这个问题的答案。

Input

第一行是两个空格分隔的整数N和K。 之后N行每行2*K个整数A_1,B_1,A_2,B_2,…,A_K,B_K,表示N个节点的K条出边。
第i行表示第 i-1 个节点,这一行的A_S,B_S的值表示第S个大写字母对应的出边的终点为A_S,权值为B_S。
下面一行有一个字符串,表示咒语。 由于咒语的长度会非常长,将采用压缩方式给出,用[SA]表示连续S个字母A,S是一个正整数,A是单个字母。
比如说,字符串[5A]BC[3A][3C]表示的咒语为AAAAABCAAACCC。 之后一个正整数M,表示取模的底数。
字符串长度≤120000,在一个压缩节[SA]中,S≤109。K≤26,N≤10000,M≤109,所有边的权值小于10^9

Output

一个整数,表示问题的答案。

Sample Input

4 2

3 3 2 5

1 7 3 2

4 3 2 5

2 10 3 2

[3A]B[2A][2B]

10000

Sample Output

38

题解

n x t [ i ] [ j ] [ k ] nxt[i][j][k] nxt[i][j][k]表示走第i条路 往下走 2 j 2^j 2j长度 在第k个点会到达哪个点
顺便预处理一下路径前缀和
大力倍增一下…
就没了啊

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#define LL long long
#define mp(x,y) make_pair(x,y)
using namespace std;
inline int read()
{int f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
inline void write(int x)
{if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');
}
inline void print(int x){write(x);printf(" ");}
int mod,n,K;
int bin[35],nxt[27][35][10005],S[27][35][10005]; 
void ad(int &x,int y){x+=y;if(x>mod)x-=mod;}
char ch[120005];
int main()
{n=read();K=read();bin[0]=1;for(int i=1;i<=30;i++)bin[i]=bin[i-1]<<1;for(int i=1;i<=n;i++)for(int j=1;j<=K;j++)nxt[j][0][i]=read(),S[j][0][i]=read();scanf("%s",ch+1);int len=strlen(ch+1);mod=read();	for(int i=1;i<=30;i++)for(int j=1;j<=n;j++)for(int k=1;k<=K;k++){nxt[k][i][j]=nxt[k][i-1][nxt[k][i-1][j]];S[k][i][j]=(S[k][i-1][j]+S[k][i-1][nxt[k][i-1][j]])%mod;}int pos=1,nt,ans=0;for(int i=1;i<=len;i=nt){if(ch[i]>='A'&&ch[i]<='Z')ad(ans,S[ch[i]-'A'+1][0][pos]),pos=nxt[ch[i]-'A'+1][0][pos],nt=i+1;else{nt=i+1;while(ch[nt]!=']')nt++;int u=0,pa=ch[nt-1]-'A'+1;for(int j=i+1;j<nt-1;j++)u=u*10+ch[j]-'0';for(int j=30;j>=0;j--)if(bin[j]<=u)ad(ans,S[pa][j][pos]),pos=nxt[pa][j][pos],u-=bin[j];nt++;}}printf("%d\n",ans);return 0;
}

这篇关于[bzoj5000][乱搞]OI树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218741

相关文章

编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(铠甲:STL)

在这个充满数据结构的世界,C++已经封装了很多迅速可用的数据结构。这就像我们身上的铠甲,不管遇到什么样的怪物,都能靠着这套铠甲防御攻击。 动态数组vector 想象一下,在奇幻的世界里,有一个神奇的魔法背包,名叫vector,它来自强大的编程魔法——STL(标准模板库)。这个背包拥有三大神奇特性: 自动伸缩的魔法:不像普通的背包空间固定,vector背包能根据你放置物品的多少自动调整大小

编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(魔法帽:贪心思想)

前面几期我们介绍了打怪的武器,但是刷怪的路上不能光凭蛮力,还要有智慧。需要有魔法帽的加持才能提升你的智慧点。 这期我们讲的是贪心思想。 什么是贪心呢? 贪心算法,就像是你肚子饿了,面对一桌子各式各样的美味点心,但妈妈说你只能拿一次,而且要尽可能地吃饱。怎么办呢? 你不会一个个去计算哪个组合能让你吃得最饱,那样太慢了。相反,你会用一个简单的方法:每次选择当前看起来最大的那个点心拿。比如,你先

【进程OI】重定向的本质用户级缓冲区

文章目录 用实验观察重定向的原理实验一:实验二:用户级缓冲区 重定向的本质dup、dup1、dup2函数dup()dup2() 用实验观察重定向的原理 实验一: 本节内容需要同学们了解文件描述符的原理,有需要的可以去看我之前写的博客: 详细讲解文件描述符 观察以下代码的输出结果: 上面代码看起来人畜无害,但是仔细观察我们就会发现几个问题: 1.为什么log.txt文件的

BZOJ 3799 字符串重组 贪心模拟乱搞

Description 给出一个字符串S,现希望对它进行重新组合得到 一个字符串,其比T大且是字典序最小的。 Input 输入第一行为S,第二行为T Output 输出重组后的结果,如果不存在输出-1 Sample Input abad bob Sample Output daab HINT 字符串长度<=5000

我的OI大事记

2017.8.15 free basic转C++ 初入洛谷 2018.7.10 凌晨一点打比赛祭 2018.7.20 AC100祭(呜啊我太蒻了 都多长时间了才到100) 2018.8.15 这个月我真的是无比的颓啊 今天一道普及-的题目写+调了一个小时 我今天可能又制杖了QwQ 2018.8.16 学校(NFLS)开始OI集训祭 顺带着8.16-8.17两天几乎啥也没听到还一题没做的颓废

算法比赛|赛制介绍| ACM, IOI赛制, OI赛制

🔥博客介绍`: 27dCnc 🎥系列专栏: <<数据结构与算法>> << 算法入门>> << C++项目>> 🎥 当前专栏: << 算法入门>> 专题 : 数据结构帮助小白快速入门算法 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)o .。.:*☆ ❤️感谢大家点赞👍收藏⭐评论✍️ ACM ACM赛制指的是国际大学生程序设计竞

一位弱校选手的oi经历

锦瑟无端五十弦,一弦一柱思华年。   这只是一位不知道什么时候就要退役的oier在一节晚自习的时候写的无聊东西   曾经也想好好写一写自己的oi历程,也许会有人看,不过因为自己懒加上文笔差也一直没写,直到昨天好像pantw生日的时候看到了他的回忆录,今天终于忍不住也写了一篇,感觉这个才是真的流水账233   刚刚切掉一道杜教筛的题目,按照自己给自己的计划杜教筛差不多该告一段落了,已经没有多少时间

基于数据驱动的海表悬浮物浓度插值方法研究 - 以海洋遥感数据为例(多种方法;基于OI)

Data-Driven Interpolation of Sea Surface Suspended Concentrations Derived from Ocean Colour Remote Sensing Data 基于数据驱动的海表悬浮物浓度插值方法研究 - 以海洋遥感数据为例 Abstract 由于复杂的自然和人为相互作用的影响,海洋水柱中的悬浮沉积物动力学仍然难以理解和监

[Z-Trening-718][BALKAN OI 2009]Reading

Q1 : 邻接矩阵只能限制边数 怎么控制路径长度呢? A : 把路径长度转换为多条边 每个点虚拟为五个 Q2 : 怎么统计长度小于N的点的和呢? A :虚拟一个空字符 他与任意真实字符距离为1 这样我们可以自然的构造一些开头是空字符的单词 比如"__AA" 这个单词开头有两个空字符 总体相异度为4 还有就是此题特别卡常数 其实我是没过的 用了1700+ms才过 题目可以直接在Vju

杨辉三角与oi知识体系

1.什么是杨辉三角形 2.入门:使用二维递推(小技巧:增加第0列、初始化问题) 3.递归函数实现 4.递推公式和递归函数,两者效率比较,时间空间复杂度分析 5.进阶:滚动数组(空间复杂度的优化),迭代 6.用一个数组,再优化空间。(顺序逆序问题) 7.经典例题:01背包二维数组实现 8.经典例题:01背包一维数组实现(空间优化) 9.提升:用组合公式表示杨辉三角形 10.从多项