完全不会啊,看题解还看了好久,我是蒟蒻$QAQ$

$zyf$的题解挺好的:http://blog.csdn.net/clove_unique/article/details/51059425

$fail树$的性质完全不知道啊,只好现学,,,

根据读入的顺序来扫$Trie树$并更新树状数组真的好神!我一辈子都想不出来$TwT$

还有$dfs序$那里我还想了好久,,,聪哥说我的表情一脸懵逼

最终看(抄)题解做出来了,用了$4h+$,我好制杖

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200003
#define lowbit(x) (x & (-x))
#define read(x) x=getint()
using namespace std;
inline int getint() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - '0';
return k * fh;
}
struct node {
int nxt, to;
} E[N * 26];
int fa[N], watch[N], c[N][26], cnt = 0, tot = 0, point[N];
int fail[N], L[N], R[N], C[N], m, ans[N];
inline void _(char *s) {
int len = strlen(s), now = 0;
for(int i = 0; i < len; ++i){
if (s[i] >= 'a' && s[i] <= 'z') {
int t = s[i] - 'a';
if (!c[now][t])
c[now][t] = ++cnt;
fa[cnt] = now;
now = cnt;
}else
if (s[i] == 'P')
watch[++tot] = now;
else
now = fa[now];
}
}
inline void ins(int x, int y) {E[++cnt].nxt = point[x]; E[cnt].to = y; point[x] = cnt;}
inline void __() {
cnt = 0;
queue <int> q;
for(int t = 0; t < 26; ++t)
if (c[0][t])
q.push(c[0][t]), ins(0, c[0][t]);
while (!q.empty()) {
int now = q.front();
q.pop();
for(int t = 0; t < 26; ++t)
if (!c[now][t])
c[now][t] = c[fail[now]][t];
else {
int u = c[now][t];
fail[u] = c[fail[now]][t];
ins(fail[u], u);
q.push(u);
}
}
}
inline void ___(int x) {
L[x] = ++cnt;
for(int tmp = point[x]; tmp; tmp = E[tmp].nxt)
___(E[tmp].to);
R[x] = cnt;
} inline void inc(int pos, int num) {
for(; pos <= cnt; pos += lowbit(pos))
C[pos] += num;
}
inline int sum(int pos) {
int s = 0;
for(; pos > 0; pos -= lowbit(pos))
s += C[pos];
return s;
} struct nnode {
int x, y, id;
} A[N];
inline bool cmp(nnode n1, nnode n2) {return n1.y < n2.y;}
int main() {
char s[N << 1];
scanf("%s", s);
_(s);
__(); cnt = 0;
___(0); read(m);
for(int i = 1; i <= m; ++i)
read(A[i].x), read(A[i].y), A[i].id = i;
sort(A + 1, A + m + 1, cmp); int len = strlen(s), now = 0, con =1;
tot = 0;
for(int i = 0; i < len; ++i) {
if (s[i] >= 'a' && s[i] <= 'z')
now = c[now][s[i] - 'a'], inc(L[now], 1);
else
if (s[i] == 'P') {
if (++tot == A[con].y) {
for(; tot == A[con].y; ++con)
ans[A[con].id] = sum(R[watch[A[con].x]]) - sum(L[watch[A[con].x]] - 1);
}
} else
inc(L[now], -1), now = fa[now];
} for(int i = 1; i <= m; ++i)
printf("%d\n", ans[i]);
return 0;
}

进度这么慢,省选爆零节奏(=゚ω゚)ノ

【BZOJ 2434】【NOI 2011】阿狸的打字机 fail树的更多相关文章

  1. 【BZOJ 2434】 [Noi2011]阿狸的打字机 fail树+树状数组

    就是考了一个fail树的神奇应用我们建出fail树之后,发现我们就是在求y到根的路径上所有的点在以x为根的子树里的个数,这个我们离线后用树状数组+dfs序即可解决 #include <cstdi ...

  2. bzoj 2434: 阿狸的打字机 fail树+离线树状数组

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2434 题解: 首先我们可以发现这个打字的过程本身就是在Trie上滚来滚去的过程 所以我们 ...

  3. bzoj 2434 阿狸的打字机 fail树的性质

    如果a串是另b串的后缀,那么在trie图上沿着b的fail指针走一定可以走到a串. 而a串在b串里出现多少次就是它是多少个前缀的后缀. 所以把fail边反向建树维护个dfs序就行了. 并不是很难... ...

  4. [NOI 2011]阿狸的打字机

    Description 题库链接 给你 \(n\) 个单词, \(m\) 组询问,每组询问形同 \((x,y)\) ,询问 \(x\) 串在 \(y\) 串中出现多少次. \(1\leq n,m\le ...

  5. NOI 2011 阿狸的打字机(AC自动机+主席树)

    题意 https://loj.ac/problem/2444 思路 ​多串匹配,考虑 \(\text{AC}\) 自动机.模拟打字的过程,先建出一棵 \(\text{Trie}\) 树,把它变成自动机 ...

  6. NOI 2011 阿狸的打字机 (AC自动机+dfs序+树状数组)

    题目大意:略(太长了不好描述) 良心LOJ传送门 先对所有被打印的字符串建一颗Trie树 观察数据范围,并不能每次打印都从头到尾暴力建树,而是每遍历到一个字符就在Trie上插入这个字符,然后记录每次打 ...

  7. BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】

    题目分析: 画一下fail树,就会发现就是x的子树中属于y路径的,把y剖分一下,用线段树处理 $O(n*log^2 n)$. 代码: #include<bits/stdc++.h> usi ...

  8. BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)

    题意:链接 方法:AC自己主动机与fail树性质 解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222! ) 这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机. ...

  9. 「BZOJ 2434」「NOI 2011」阿狸的打字机「AC自动机」

    题意 有一个打字机,支持三种操作: 字符串末尾加一个小写字母 字符串末尾减一个字符 输出这个字符串 经过不超过\(n\)次操作后有\(m\)组询问:\((x,y)\),表示第\(x\)次输出第字符串在 ...

随机推荐

  1. Eclipse里面代码上下文变量点击后不一起变色

    使用eclipse的时候,点击变量发现该类里面的变量颜色不变,经百度得知这个功能没有打开,下面打开方法: 1.使用“Alt+Shift+O”对该提示功能的开/关切换2.可以在以下设置选中后的文本提示颜 ...

  2. 单机搭建Android开发环境(五)

    前文介绍了Android系统开发环境的搭建,本文将简单介绍Android应用开发环境的搭建. 基于Android Studio搭建应用开发环境,相比使用Eclipse简单得多.Android Stud ...

  3. 第五章项目:QuickHit

    需求概述: 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见, ...

  4. AC日记——大整数的因子 openjudge 1.6 13

    13:大整数的因子 总时间限制:  1000ms 内存限制:  65536kB 描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k. 输入 ...

  5. jquery noConflict详解

    noConflict是防止其他库也用了$作为全局变量而引起的冲突,我们看看jquery是怎么做的 首先jquery在代码的开始部分定义了2个私有变量: _jQuery = window.jQuery ...

  6. 阿里云日志api创建logStore

    , shardCount =  });                 string date = FormatRfc822Date(time);                 string con ...

  7. 用 C# 轻松读取、改变文件的创建、修改、访问时间

    创建时间是文件存入到电脑中的时间,而修改时间则是改变起内容的最后时间 // 读取文件的创建.修改.访问时间FileInfo fi = new FileInfo("C://test.txt&q ...

  8. VS2013 抛出 stackoverflow exception 的追踪

    本公司使用VWG.Caslte ActiveRecord.CSLA.net .Quantz.net 等组件做为公司的开发基础,自2007年以来,一直工作正常,但最近(2015.12月)以来,打开MDA ...

  9. PHP PSR规范

    PHP PSR-1 基本代码规范(中文版)  http://segmentfault.com/a/1190000002521577PHP PSR-2 代码风格规范 (中文版)  http://segm ...

  10. Android 开发之旅:view的几种布局方式及实践

    本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weigh ...