题目分析:

画一下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. flask登录插件 flask-login

    Flask-Login为Flask提供了用户会话管理,它处理了日常的登入登出且长时间记住用户的会话 使用: 1.配置,初始化 LoginManager 创建实例 loginManger = Login ...

  2. Appium+Python3+iOS定位元素

    前言: 最近在做IOS自动化测试,IOS的Appium环境都配置OK,执行起来真的慢,慢到怀疑人生,那么今天就来总结一下IOS定位方式和各个定位方式的速度排序. 据我观察,按查找元素的顺序速度,从快到 ...

  3. Mysql启动找不到mysql.sock文件问题(Centos7)

    刚装完Mysql5.7,将Mysql添加到开机自启.reboot之后mysql服务却没启动起来, 直接输入mysql –uroot –p ,出现如下错误,找不到mysql.sock文件.用servic ...

  4. element ui主题色跟换

    node_modules\ element ui\ lib\ theme-dafault  下载的主题色替换掉改文件... ================== 但是会出现  搜索框iocon 样式换 ...

  5. JS 原型与原型链

    图解: 一.普通对象 跟 函数对象 JavaScript 中,一切皆对象.但对象也有区别,分为 普通对象 跟 函数对象,Object 和 Function 是 JavaScript 自带的函数对象. ...

  6. 【评分】Alpha 事后诸葛亮(团队)

    [评分]Alpha 事后诸葛亮(团队) 总结 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 倒扣本次作业分数 本次作业都是以问答形式进行,大部分同学在回答问题方面都一 ...

  7. ModelAttribute用法之一

    @ModelAttribute也可以做为Model输出到View时使用,比如: 测试例子   package com.my.controller; import java.util.ArrayList ...

  8. 第四章 MyBatis-SQL映射文件

    MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 SQL映射文件的几个顶级元素(按照定义的顺序) mapper - namespace cache - 配置 ...

  9. mysql之整合ssm多数据源配置

    一,基于SSM框架的多数据源配置 1.创建DynamicDataSourceHolder用于持有当前线程中使用的数据源标识 public class DynamicDataSourceHolder { ...

  10. 【学习总结】Git学习-参考廖雪峰老师教程九-使用码云

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...