bzoj 2434 阿狸的打字机 fail树的性质
如果a串是另b串的后缀,那么在trie图上沿着b的fail指针走一定可以走到a串。
而a串在b串里出现多少次就是它是多少个前缀的后缀。
所以把fail边反向建树维护个dfs序就行了。
并不是很难。。。但没想出来TAT
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 200005
#define inf 0x3f3f3f3f
using namespace std;
int n;
int ch[N][], fa[N];
int a[N];
int mn[N],zhi[N],size[N];
void push_up(int x)
{
size[x] = size[ch[x][]] + size[ch[x][]] + ;
mn[x] = min(zhi[x], min(mn[ch[x][]], mn[ch[x][]])); return;
}
int rev[N];
void push_down(int x)
{
if (rev[x])
{
rev[x] ^= ; rev[ch[x][]] ^= ; rev[ch[x][]] ^= ;
swap(ch[x][], ch[x][]);
}
return;
}
void rotate(int p)
{
int q = fa[p], y = fa[q], x = (ch[q][] == p);
ch[q][x] = ch[p][x ^ ]; fa[ch[q][x]] = q;
ch[p][x ^ ] = q; fa[q] = p;
fa[p] = y;
if (y)
{
if (ch[y][] == q)ch[y][] = p;
else ch[y][] = p;
}
push_up(q); return;
}
int root;
void splay(int x,int yy)
{
for (int y; y = fa[x]; rotate(x))
{
if (y == yy)break;
if (fa[y] != yy)
{
if ((ch[fa[y]][] == y) ^ (ch[y][] == x))rotate(x);
else rotate(y);
}
}
push_up(x);
if (!yy)root = x;
}
int cnt;
int find(int k, int x)
{
push_down(k);
if (mn[ch[k][]] == x)
{
return find(ch[k][], x);
}
if (zhi[k] == x)return size[ch[k][]] + ;
return find(ch[k][], x) + size[ch[k][]] + ;
}
int fd(int k, int x)
{
push_down(k);
if (size[ch[k][]] + == x)return k;
if (size[ch[k][]] + >= x)return fd(ch[k][],x);
return fd(ch[k][], x - size[ch[k][]] - );
}
struct node
{
int yuan,z;
friend bool operator < (node aa,node bb)
{
if(aa.z!=bb.z)return aa.z<bb.z;
return aa.yuan<bb.yuan;
}
}s[N];
int yin[N];
int main()
{
scanf("%d", &n); mn[] = inf;
for (int i = ; i <= n; i++)
{
s[i].yuan=i;scanf("%d",&s[i].z);
}
sort(s+,s+n+);
for(int i=;i<=n;i++)
{
a[s[i].yuan]=i;
}
root = ; a[n + ] = inf;
ch[][] = ; zhi[] = a[]; size[] = n + ;
for (int i = ; i <= n + ; i++)
{
size[i] = n - i + ;
zhi[i] = a[i]; fa[i] = i - ; ch[i - ][] = i;
}
for (int i = n + ; i >= ; i--)push_up(i);
splay(n, );
for (int i = ; i <= n; i++)
{
int y = find(root, mn[root]);
if(i!=n)printf("%d ",y+(i-));
else printf("%d",y+(i-));
int t = fd(root, y+);
splay(t, );
rev[ch[t][]] ^= ;
t = fd(root, );
splay(t, );
ch[t][] = ;
push_up(t);
}
puts("");
return ;
}
bzoj 2434 阿狸的打字机 fail树的性质的更多相关文章
- bzoj 2434: 阿狸的打字机 fail树+离线树状数组
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2434 题解: 首先我们可以发现这个打字的过程本身就是在Trie上滚来滚去的过程 所以我们 ...
- 【BZOJ 2434】【NOI 2011】阿狸的打字机 fail树
完全不会啊,看题解还看了好久,我是蒟蒻$QAQ$ $zyf$的题解挺好的:http://blog.csdn.net/clove_unique/article/details/51059425 $fai ...
- BZOJ 2434 阿狸的打字机(ac自动机+dfs序+树状数组)
题意 给你一些串,还有一些询问 问你第x个串在第y个串中出现了多少次 思路 对这些串建ac自动机 根据fail树的性质:若x节点是trie中root到t任意一个节点的fail树的祖先,那么x一定是y的 ...
- 【BZOJ 2434】 [Noi2011]阿狸的打字机 fail树+树状数组
就是考了一个fail树的神奇应用我们建出fail树之后,发现我们就是在求y到根的路径上所有的点在以x为根的子树里的个数,这个我们离线后用树状数组+dfs序即可解决 #include <cstdi ...
- AC自动机:BZOJ 2434 阿狸的打字机
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1834 Solved: 1053[Submit][Sta ...
- BZOJ 2434 阿狸的打字机
http://www.lydsy.com/JudgeOnline/problem.php?id=2434 思路:建立fail树,并找出dfs序,那剩下要做的就是每次找到一个串的位置,然后询问它的区间里 ...
- BZOJ 2434 阿狸的打字机 | AC自动机
题目戳这里 AC自动机上有神奇的东西叫做fail指针--所有fail指针连起来恰好构成一棵以1为根的树! 而这道题问x在y中出现过多少次,就是问Trie树上根到y的结束节点的路径上有多少节点能通过跳f ...
- [NOI 2011][BZOJ 2434] 阿狸的打字机
传送门 AC自动机 + 树状数组 建成AC自动机后,设end[i]为第i个串的末尾在Trie树上的节点. 可以发现,对于一个询问(x,y),ans等于Trie树上root到end[y]这条链上fail ...
- BZOJ 2434 阿狸的打字机(fail树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2434 题意:阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28 ...
随机推荐
- java Io流更新文件内容
package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOut ...
- java web学习总结(二十三) -------------------编写自己的JDBC框架
一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...
- 2016年6月份那些最实用的 jQuery 插件专辑
jQuery 是一个快速.流行的 JavaScript 库,jQuery 用于文档处理.事件处理.动画和 Ajax 交互非常简单,学习曲线也很平坦.2016年6月的 jQuery 插件专辑里,我们选择 ...
- 初识JAVA(二)(送给Java和安卓初学者)----常见错误
博主接着上篇的来讲哦,以后的更新中,博主会出一些练习题,有兴趣的可以做做然后吧代码粘贴到下面,大家可以一起研究学习,一起进步,本篇文章主要讲的是: 一.常见错误 二.连接上篇一起的训练 无论是什么方向 ...
- c++宏定义命令
在程序开始以#开头的命令,他们是预编译命令.有三类预编译命令:宏定义命令.文件包含命令.条件编译命令:今天聊聊宏定义: 宏定义命令将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替 ...
- 基于JQuery实现的文本框自动填充功能
1. 实现的方法 /* * js实现的文本框的自动完成功能 */ function doAutoComplete(textid,dataid,url){ $("#" + texti ...
- Action.c(58): Error -27796: Failed to connect to server "hostname"
分析: 因为负载生成器的性能太好发数据特别快,服务器响应也特别快,从而导致负载生成器的端口在没有timeout之前就全部占满了. 解决方案一: 在负载生成器的注册表HKEY_LOCAL_MACHI ...
- RabbitMQ调试与测试工具-v1.0.1 -提供下载测试与使用
最近几天在看RabbitMQ,所以发了两天时间写了一个调试和测试工具.方便使用. 下载地址:RabbitMQTool-V1.0.1.zip
- Junit mockito解耦合测试
Mock测试是单元测试的重要方法之一. 1.相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http:/ ...
- 移动电商时代、微分销商城O2O生活圈系统开发功能分析
O2O生活圈系统的功能管理简单易用,随时随地发布新商品然后进行分类.管理,老少皆宜童叟无欺,实现多供应商多店铺经营模式的多层分润分销平台,满足企业自营商品与第三方供应商商品共存,打造京东+拍拍微店模式 ...