BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】
题目分析:
画一下fail树,就会发现就是x的子树中属于y路径的,把y剖分一下,用线段树处理
$O(n*log^2 n)$。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; string str;
struct node{int ch[],fail,fa;}T[maxn];
int star[maxn],ans[maxn],num = ,snum,m;
int dfsin[maxn],dfsout[maxn],poss[maxn]; // failtree
int Tnb[maxn],top[maxn],sz[maxn];
vector <int> g[maxn];
vector<pair<int,int> > Qy[maxn]; void read(){
ios::sync_with_stdio(false);
cin.tie();
cin >> str;
int now = ;
for(int i=;i<str.length();i++){
if(str[i] == 'B') now = T[now].fa;
else if(str[i] == 'P') star[++snum] = now;
else{
if(T[now].ch[str[i]-'a']) now = T[now].ch[str[i]-'a'];
else{
T[now].ch[str[i]-'a'] = ++num;
T[num].fa = now;
now = num;
}
}
}
snum = ;
} void dfs(int now){
dfsin[now] = dfsout[now] = ++snum;
poss[snum] = now;
for(int i=;i<g[now].size();i++){
dfs(g[now][i]);
dfsout[now] = dfsout[g[now][i]];
}
} queue<int> q;
void BuildACAutomaton(){
q.push();T[].fail = ;
while(!q.empty()){
int k = q.front();q.pop();
for(int i=;i<;i++){
if(T[k].ch[i] == ) continue;
int ff = T[k].fail;
while(ff != && T[ff].ch[i] == ) ff = T[ff].fail;
if(T[ff].ch[i]==T[k].ch[i]||T[ff].ch[i]==)T[T[k].ch[i]].fail=;
else T[T[k].ch[i]].fail = T[ff].ch[i];
q.push(T[k].ch[i]);
g[T[T[k].ch[i]].fail].push_back(T[k].ch[i]);
}
}
snum = ; dfs(); snum = ;
} int QT[maxn*]; void Add(int now,int tl,int tr,int pos){
if(tl == tr){QT[now]++;return;}
int mid = (tl+tr)/;QT[now]++;
if(mid >= pos) Add(now<<,tl,mid,pos);
else Add(now<<|,mid+,tr,pos);
}
int Query(int now,int tl,int tr,int l,int r){
if(tl >= l && tr <= r) return QT[now];
if(tl > r || tr < l) return ;
int mid = (tl+tr)/;
return Query(now<<,tl,mid,l,r)+Query(now<<|,mid+,tr,l,r);
} void dfsmiao(int now){
for(int i=;i<;i++){
if(T[now].ch[i]==)continue;
dfsmiao(T[now].ch[i]);
sz[now] += sz[T[now].ch[i]];
}
sz[now]++;
} void dfsyeah(int now,int tp){
int son = ;top[now] = tp;Tnb[now] = ++snum;
for(int i=;i<;i++){
if(sz[T[now].ch[i]] > sz[son]) son = T[now].ch[i];
}
if(son) dfsyeah(son,tp);
for(int i=;i<;i++){
if(T[now].ch[i] == || T[now].ch[i] == son) continue;
dfsyeah(T[now].ch[i],T[now].ch[i]);
}
} void treechain(){
dfsmiao();
dfsyeah(,);
} void readquery(){
cin >> m;
for(int i=;i<=m;i++){
int x,y; cin >> x >> y;
x = star[x];y = star[y];
Qy[poss[dfsin[x]-]].push_back(make_pair(y,i));
Qy[poss[dfsout[x]]].push_back(make_pair(y,i));
}
} void solve(int endpos,int now){
if(ans[now]) ans[now] = -ans[now];
while(endpos){
ans[now] += Query(,,num,Tnb[top[endpos]],Tnb[endpos]);
endpos = T[top[endpos]].fa;
}
} void work(){
for(int i=;i<=num;i++){
int now = poss[i];
Add(,,num,Tnb[now]);
for(int j=;j<Qy[now].size();j++){
solve(Qy[now][j].first,Qy[now][j].second);
}
}
for(int i=;i<=m;i++) cout<<ans[i]<<endl;
} int main(){
//freopen("7.in","r",stdin);
read();
treechain();
BuildACAutomaton();
readquery();
work();
return ;
}
BZOJ2434 [NOI2011] 阿狸的打字机 【树链剖分】【线段树】【fail树】【AC自动机】的更多相关文章
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- HDU4897 (树链剖分+线段树)
Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...
- GSS7 spoj 6779. Can you answer these queries VII 树链剖分+线段树
GSS7Can you answer these queries VII 给出一棵树,树的节点有权值,有两种操作: 1.询问节点x,y的路径上最大子段和,可以为空 2.把节点x,y的路径上所有节点的权 ...
- Aizu 2450 Do use segment tree 树链剖分+线段树
Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...
- 【POJ3237】Tree(树链剖分+线段树)
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
随机推荐
- .NET-记一次架构优化实战与方案-梳理篇
目录 .NET-记一次架构优化实战与方案-梳理篇 .NET-记一次架构优化实战与方案-前端优化 .NET-记一次架构优化实战与方案-底层服务优化 前言 程序员输出是他敲写的代码,那么输入就是他思考好的 ...
- .NetCore 资料分享
.NetCore3.0 你还不打算入手么? 这次主要是推荐一些自己学习中遇到的一些好的资料和自己的看法( 我推荐的都是我看过的 Asp.Net Core 不做介绍了,直接分享资料了 资料: .NetC ...
- nginx Location 语法基础知识
URL地址匹配是Nginx配置中最灵活的部分 Location 支持正则表达式匹配,也支持条件匹配,用户可以通过location指令实现Nginx对动丶静态网页的过滤处理. Nginx locatio ...
- 微软是如何让我再次爱上.Net Core和C#的
“为什么你还想用ASP.NET,难道你还活在90年代吗?”这正是我的一位老同事在几年前我们即将开始的项目中我提出考虑使用ASP.NET时所说的话.当时我很大程度上认同他的看法,微软已经开发了伟大的开发 ...
- Python-待
内置函数总结 https://www.cnblogs.com/jason-lv/p/8243141.html https://www.cnblogs.com/pyyu/p/6702896.html 数 ...
- Mysql数据库中索引的概念总结
1.索引的目的是什么 1.快速访问数据表中的特定信息,提高检索速度 2.创建唯一性索引,保证数据库表中每一行数据的唯一性. 3.加速表和表之间的连接 4.使用分组和排序子句进行数据检索时,可以显著减少 ...
- iOS开发造轮子 | 通用占位图
https://www.jianshu.com/p/beca3ac24031 实际运用场景: 没网时的提示view,tableView或collectionView没内容时的展示view,以及其它特殊 ...
- 软件工程(FZU2015) 增补作业
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/ ...
- How To: Capture Android & iOS Traffic with Fiddler
How To: Capture iOS Traffic with Fiddlerhttps://www.telerik.com/blogs/how-to-capture-ios-traffic-wit ...
- JEECG DataGridColumn dictionary使用问题
<t:dgCol title="线索所属人" field="ownerId" query="true" queryMode=&q ...