bzoj2434: [Noi2011]阿狸的打字机

2024-04-02 10:48

本文主要是介绍bzoj2434: [Noi2011]阿狸的打字机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2434

一个讲得很详细的题解:http://blog.csdn.net/huzecong/article/details/7769988

思路:这题的想法有点神啊....

先构建AC自动机,然后怎么判断一个串b是a的子串呢?用fail指针就可以了。如果a串中有节点可以通过fail指针走到b的终止节点,那么b就在a中出现过。有n个节点可以走到b,那么b就出现过n次。

现在就有一个暴力的想法,枚举a串的每个节点的fail看是否能到b,但是这是显然会T的。

然后我们可以倒过来想,把fail指针反向,建一棵fail树,对于b串,统计子树中有多少个a串的节点即可。

子树的节点的dfs序是相连的。

这样我们就可以用树状数组维护一下就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int maxn=100010;
using namespace std;
int m,len,num,preq[maxn],nowq[maxn],sonq[maxn],l[maxn],r[maxn],bit[maxn],pos[maxn],cnt,pre[maxn],now[maxn],son[maxn],ans[maxn];char s[maxn],ch;
void change(int x,int val){for (;x<=cnt;x+=x&-x) bit[x]+=val;}
int query(int x){int res=0;for (;x;x-=x&-x) res+=bit[x];return res;
}
void add(int a,int b){pre[++num]=now[a],now[a]=num,son[num]=b;}
void read(int &x){for (ch=getchar();!isdigit(ch);ch=getchar());for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
}struct AC_DFA{int tot,ch[maxn][26],fail[maxn],q[maxn],fa[maxn],head,tail;void build(){int p=0,id=0;for (int i=0;i<len;i++)if (s[i]=='P') pos[++id]=p;else if (s[i]=='B') p=fa[p];else{if (!ch[p][s[i]-'a']) ch[p][s[i]-'a']=++tot,fa[tot]=p;p=ch[p][s[i]-'a'];}}void getfail(){head=0,q[tail=1]=0,fail[0]=-1;while (head!=tail){int x=q[++head];for (int i=0;i<26;i++)if (ch[x][i])q[++tail]=ch[x][i],fail[ch[x][i]]=x==0?0:ch[fail[x]][i];else ch[x][i]=x==0?0:ch[fail[x]][i];}}void dfs(int x){l[x]=++cnt;for (int y=now[x];y;y=pre[y])dfs(son[y]);r[x]=cnt;}void work(){int p=0,id=0;change(l[0],1);for (int i=0;i<len;i++)if (s[i]=='P'){id++;for (int y=nowq[id];y;y=preq[y]){int t=pos[sonq[y]];ans[y]=query(r[t])-query(l[t]-1);}}else if (s[i]=='B') change(l[p],-1),p=fa[p];else p=ch[p][s[i]-'a'],change(l[p],1);}
}T;int main(){scanf("%s%d",s,&m);len=strlen(s);for (int i=1,x,y;i<=m;i++){read(x),read(y);preq[i]=nowq[y],sonq[i]=x,nowq[y]=i;}T.build(),T.getfail();for (int i=1;i<=T.tot;i++) add(T.fail[i],i);T.dfs(0),T.work();for (int i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;
}


这篇关于bzoj2434: [Noi2011]阿狸的打字机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

jq自定义插件—$.fn的使用之(打字机)

原理:         把html里的代码读进来,         然后跳过“<”和“>”之间的代码,         顺便保存了内容的格式,         然后一个定时器,逐个输出。      用到的基础知识: jQuery为开发插件提拱了两个方法,分别是:                 jQuery.fn.extend(object);

css实现文字打字机效果

html <body><p class="line animation">我和我的祖国,一刻也不能分割</p></body> css <style type="text/css">html,body {height: 100%;}body {overflow: hidden;display: flex;justify-content: center;align-items: cent

【主题世界】阿狸对着你卖萌桌面主题

主题名称:《 可爱阿狸桌面主题 》  主题类型:主题世界 - XP主题下载桌面主题 - 可爱阿狸桌面主题  主题大小:1.73MB 更新时间:2013-07-10 主题简介: 可爱阿狸卡通桌面壁纸下载《鼠标右键另存为本地》 可爱阿狸卡通桌面主界面效果图 可爱阿狸卡通桌面开始菜单效果图 可爱阿狸卡通桌面图标效果图 可爱阿狸卡通桌面鼠标效果图

有趣的css - 打字机动画效果

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是使用 css 实现好玩的单行打字机效果,和我一起看看吧。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 知识点: ① animation 动画属性中 steps() 参数

【达内课程】自定义控件(奔跑的阿狸)

这一节要的效果如图 新建AnimationView public class AnimationView extends View {Bitmap[] bitmapArray = new Bitmap[4];int currentIndex = 0;int viewWidth, viewHeight;int sleepTime = 1000;boolean isRunning = true;T

BZOJ2435: [Noi2011]道路修建(简单dfs)

Description 在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道路。 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4个国家,如果该道路长度为 1,则费用为1×|2 –

前端对接fastGPT流式数据+打字机效果

首先在对接api时 参数要设置stream: true, const data = {chatId: 'abc',stream: true,//这里true返回流式数据detail: false,variables: {uid: 'sfdsdf',name: 'zhaoyunyao,'},messages: [{ content: text, role: 'user' }]};

翁恺C语言程序设计:学习笔记6(无穷大\计算精度\char\逃逸字符\回车换行与打字机)

无穷大与不存在的数1 浮点数/0:无穷大(正负); 0/0:不存在的数; 整数/0:编译不通过,在C语言中,整数范围内是没有无穷大的,但是浮点数范围内是有无穷大的。 float有7位有效数字; a=1.345f 带有一个f才表示float,不然就是double; 表示相等时尽量不用==,因为精度问题;可以采用fabs(a-b)<1e-12,两者差的绝对值小于很小的数。 计算精度 当需要计算精确

P1383 高级打字机(可持续化线段树)

题目描述 早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。 请为这种高级打字机设计一个程序,支持如下 33 种操作: T x:Type 操作,表示在文章末尾打下一个小写字母 x。U x:Undo 操作,表示撤销最后的 x 次修改操作。Q x:Query 操作,表示询问当前文章中第 x 个字母并输出。请注意 Query 操作并不算修改操作。 文章一开

Vue3 + TypeScript 实现自动打字、打字机动画、动画打字工具(TypeIt)

一、介绍 👵 👵 TypeIt是一个JavaScript库,用于创建简单而流畅的打字效果和动画效果。它可以用于网页开发中的很多场景,例如创建动态文字效果、制作页面过渡动画、增强用户体验等。 我们还可以利用它进行一些后端日志的回显,如果某个进程后端实时或者定时返回结果,前端进行一个动画打字的回显功能,一方面可以让我们的页面更丰富,另一方面可以给客户一个很好的体验。 配置项说明  👇 👇