题目分析:

画一下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自动机】的更多相关文章

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  2. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  3. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  4. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  5. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  6. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  7. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  8. GSS7 spoj 6779. Can you answer these queries VII 树链剖分+线段树

    GSS7Can you answer these queries VII 给出一棵树,树的节点有权值,有两种操作: 1.询问节点x,y的路径上最大子段和,可以为空 2.把节点x,y的路径上所有节点的权 ...

  9. 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 ...

  10. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

随机推荐

  1. prometeus, grafana部署以及监控mysql

    什么是普罗米修斯? Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包 .自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有一个非常活跃的开 ...

  2. Django组件 之 ookie 和 session

    -----------------------------------------------------------------------------------------相信自己,水滴石穿,不 ...

  3. koa-router

    为了处理URL,我们需要引入koa-router这个middleware,让它负责处理URL映射. 我们把上一节的hello-koa工程复制一份,重命名为url-koa. 先在package.json ...

  4. Python—randonm模块介绍

    random是python产生伪随机数的模块 >>> random.randrange(1,10) #返回1-10之间的一个随机数,不包括10 >>> random ...

  5. 【RSYSLOG】Log4x To Rsyslog Config

    Log4x To Rsyslog Config Log4net配置 <!--RemoteSyslogAppender--> <appender name="remoteSy ...

  6. mysql实现成绩表中成绩的排名

    有这样的一个表: 如果两个分数相同,则两个分数排名(Rank)相同平分后的下一个名次应该是下一个连续的整数值. 因此,名次之间不应该有“间隔”! 此时有2种方法: 第一: select grade, ...

  7. beego 自定义控制器与路由

    框架浅析 这是之前使用bee创建的webapp目录层级结构: ├── conf 配置文件 │ └── app.conf ├── controllers 控制器 │ └── default.go ├── ...

  8. JDK8 的FullGC 之 metaspace

    JDK8 的FullGC 之 metaspace - 简书https://www.jianshu.com/p/1a0b4bf8d498

  9. 缓存session,cookie,sessionStorage,localStorage的区别

    https://www.cnblogs.com/cencenyue/p/7604651.html(copy) 浅谈session,cookie,sessionStorage,localStorage的 ...

  10. SQL查询临时表空间的数据