P2414 [NOI2011] 阿狸的打字机

news/2024/9/20 18:42:48/文章来源:https://www.cnblogs.com/Yuan-Jiawei/p/18423042

题目

image

思路

将每一个输出的串放入一个 Trie 树中。

考虑离线处理询问 \((x, y)\),对于每一个 \(y\) 集中处理所有的 \(x\)\(y\) 在 Trie 树上走,走过的点标记一下,结果就是 \(x\) 字符串结尾节点在 fail 树上的对应节点的子树的标记数量。

记得在节点离开的时候撤销标记。

代码

#include <bits/stdc++.h>using namespace std;const int N = 100010, M = 2600010;struct edge {int to, next;
} e[M];int head[M], idx = 1;void add(int u, int v) {idx++;e[idx].to = v;e[idx].next = head[u];head[u] = idx;
}string opt_str;
int q, ans[N];
vector<pair<int, int> > query[N];struct ac {int son[26];int fa;int fail;
} t[N];int ac_idx;
int val[N];void insert() {int p = 0, str_idx = 0;for (auto x : opt_str) {if (x >= 'a' && x <= 'z') {int u = x - 'a';if (!t[p].son[u]) t[p].son[u] = ++ac_idx;t[t[p].son[u]].fa = p;p = t[p].son[u];}else if (x == 'B') p = t[p].fa;else {str_idx++;val[str_idx] = p;}}
}void getfail() {queue<int> q;for (int i = 0; i < 26; i++) {if (t[0].son[i]) {q.push(t[0].son[i]);}}while (q.size()) {int g = q.front();q.pop();for (int i = 0; i < 26; i++) {if (t[g].son[i]) {t[t[g].son[i]].fail = t[t[g].fail].son[i];q.push(t[g].son[i]);}else t[g].son[i] = t[t[g].fail].son[i];}}for (int i = 1; i <= ac_idx; i++) add(t[i].fail, i);
}int dfn[N], sz[N], dfn_idx;void dfs(int u, int fa) {sz[u] = 1, dfn[u] = ++dfn_idx;for (int i = head[u]; i; i = e[i].next) {int to = e[i].to;if (to == fa) continue;dfs(to, u);sz[u] += sz[to];}
}int tr[N];void modify(int u, int x) {if (u <= 0) return;for (; u < N; u += u & -u) {tr[u] += x;}
}int ask(int u) {if (u <= 0) return 0;int ans = 0;for (; u; u -= u & -u) ans += tr[u];return ans;
}void getans() {int p = 0, str_idx = 0;for (auto x : opt_str) {if (x >= 'a' && x <= 'z') {int u = x - 'a';p = t[p].son[u];modify(dfn[p], 1);}else if (x == 'B') {modify(dfn[p], -1);p = t[p].fa;}else {str_idx++;for (auto [x, y] : query[str_idx]) {int ver = val[x];ans[y] = ask(dfn[ver] + sz[ver] - 1) - ask(dfn[ver] - 1);}}}
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> opt_str >> q;for (int i = 1; i <= q; i++) {int l, r;cin >> l >> r;query[r].push_back({l, i});}insert();getfail();dfs(0, 0);getans();for (int i = 1; i <= q; i++) cout << ans[i] << '\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0920

线代 舒尔公式,化上三角,下三角,对角阵 范德蒙德行列式 X型行列式,{主对角中下标之和为(2k+1)的两项乘积-副对角中下标之和为(2k+1)的两项乘积【需与前面两项下标号相同】}的连乘 宽对角,a2=4bc,a2≠4bc计组 MAR位数说明存储单元位数 MDR位数说明字长 编译器:将高级语…

DeepFM

参考资料:https://blog.csdn.net/u012328159/article/details/122938925 https://blog.csdn.net/u012328159/article/details/120684544?spm=1001.2014.3001.5501DeepFM FM部分 目前在模型层面做交叉特征的难点主要有以下两个方面:交叉特征的参数独立,强依赖于在样本中的共…

米尔STM32MP2核心板首发新品上市!高性能+多接口+边缘算力

米尔发布基于STM32MP257设计的嵌入式处理器模块MYC-LD25X核心板及开发板。核心板基于STM32MP2系列是意法半导体推出最新一代工业级64位微处理器,采用LGA 252 PIN设计,存储配置1GB/2GB LPDDR4、8GB eMMC,具有丰富的通讯接口,适用于高端工业HMI、边缘计算网关、新能源充电桩、…

Fork+GIT操作

上传分支,在主干,上传完成代码之后,点击新建分支,去一个名字,如1.0.9,双击分支,点击“push”即可将主干所以代码上传到分支上备份一个 合并分支,,双击进入分支,选中要合并的部分,右键点击“Cherry-pick”,再次点击“Push”

影像测试技能

主要分三种职业:3A算法开发、图像tuning,图像测试这三种。 3a算法:AE/AWB/AF的开发,入门难一些,资料很少。 图像tuning:在理解3A算法的基础上,调试3A参数,当前需求量还是比较大的,学习起来也不太难,难在实践积累,多看多调。 1、 AWB auto white balance 自动白平衡 …

Camstar建模表格弹出编辑

大部分都是用行内编辑,但是如果由弹出编辑的需求,也需要了解下。 以工单建模为例子。自己搞个VP。Grid是MaterialList。 此时,表格并不具备,弹出编辑的能力。改下表格的属性,DataSubmissionMode=Changed 添加WebPart编辑框开始修改,每个属性控件的,属性!不然会报错!!…

在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

异常筛选器可以捕获和处理 ASP.NET Core Web API 中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志、返回自定义错误信息等。前言 在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一…

js实现网页端录音功能

1、代码 首先安装依赖包:recorderxnpm install recorderx -S<template><div class="container"><div class="mt-30"><el-button @click="onStartRecord">开始录音</el-button><el-button @click="onStop…

教你几招,轻松设置Win11右键恢复旧版模样

大家好!今天要教大家如何把 Win11 右键菜单变回完整的展开模式哦!其实很简单,只要在 Windows 开始图标下面的运行里输入一段代码就可以啦!接下来就让我来详细地跟大家分享一下这个方法吧!Win11右键菜单恢复为完整展开模式的方法1、首先,按键盘上的【 Win + X 】组合键,或…

第三周《密码系统设计》学习总结思维导图

marmaid代码为:graph LRA[密码系统设计第三周] --> B[《Windows C/C++ 加密解密实战》]B --> C[第四章]C --> T[4.2 加密基础]W --> U[CryptoAPI介绍]T --> V[加密概念]T --> X[加密类型]X --> d[对称加密]X --> e[非对称加密]T --> f[加密场景]C …

从虚拟到现实:数字孪生与数字样机的进化之路

​数字化技术高速发展的当下,计算机辅助技术已成为产品设计研发中不可或缺的一环,数字样机(Digital Prototype, DP)与数字孪生技术便是产品研发数字化的典型方法。本文将主要介绍数字样机与数字孪生在国内外的发展,并针对其技术痛点提出一种基于国产自研仿真工具进行虚拟模…

WPF 数据模板Data Template

数据模板 DataTemplate 控件模板决定了数据的展示形式和用户体检,在软件UI设计中非常重要。同样数据的展示形式越来越多样化,正所谓:横看成岭侧成峰,远近高低各不同。同样的数据内容,在DataGrid中的展示是文本的列表形式,在ComboBox中是下拉框的形式。给数据披上外衣,将…