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--String 和StringBuilder、StringBuffer 的区别?
1.String是只读字符串,引用的字符串内容是无法改变的. 2.StringBuffer和StringBuilder的字符串对象可以直接进行修改. 3.StringBuilder没有被synchro ...
- C标准头文件<errno.h>
声明了错误处理相关的宏 errno errno即error number,在程序启动时被设为0,当某个库函数运行出现错误的时候,会将相应的能表达错误类型的数字赋值给这个左值,这些数字往往有相应的宏来表 ...
- 移动Web利器transformjs入门
简介 在过去的两年,越来越多的同事.朋友和其他不认识的童鞋进行移动web开发的时候,都使用了transformjs,所有必要介绍一下,让更多的人受益,提高编程效率,并享受编程乐趣.(当然transfo ...
- 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...
- SAP CRM 客户控制器与数据绑定
当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入客户控制器(Custom Controller)(译者注:SAP CRM客户端中,不同地方的Custom Controller会翻译为“客 ...
- Spring in Action 学习笔记一
Spring 核心 Spring的主要特性仅仅是 依赖注入DI和面向切面编程AOP JavaBean 1996.12 Javav 规范针对Java定义了软件组件模型,是简单的J ...
- 实现一个基于 SharePoint 2013 的 Timecard 应用(下)
现在,基于 Timecard 数据来一点儿数据分析. 应用需求 对于 Timecard,分析下面 2 个方面: 对于单个项目,分析其中每个成员的工时占比,以此了解工作量分配,为组间人员调度提供参考. ...
- 在Visual Studio 2015 中添加SharePoint 2016 开发模板
前言 SharePoint 2016已经发布很久了,然而,默认安装VS2015以后,却没有SharePoint 2016的开发模板.其实问题很简单,和VS2012开发SharePoint 2013一样 ...
- UITabBarController 基本定制
UITabBarController 定制 特点 用法 1.准备好你的tabBar图片及其他图片(哈哈哈!!!!),我的图片都放在了Assets.xcassets中. 2.导入本工程中的Categro ...
- CentOS 7 安装 Docker
CentOS 7 安装 Docker 这里介绍 ContOS 7 的安装 docker V1.2+,包括阿里云加速 docker 镜像下载的设置,这对提升使用 docker 体验至关重要.其他系统安装 ...