AC自动机,树上莫队,树状数组。。

  比赛的时候完全看不出来...赛后去膜了一波网上题解才明白= =

  离线,先把AC自动机建出来,把fail边反向建出fail树。

  发射言弹,就是将言弹结束节点的fail子树内点权+1;

  查询证言受的伤害,就是查询证言的每个前缀的结束节点的点权和。

  前缀的结束节点的点权和,也就是AC自动机上,根到证言结束位置路径上的点权和。

  每一个查询,就是查询在一段时间内,根到证言结束位置路径上的点权和。。。

  所以就树上莫队一波了。。前两维时间,第三维是AC自动机上的位置。。再来个树状数组维护一波...

  时间复杂度O(n^(3/5)logn)。。。。卡时过的。。。还要注意一下块的大小。。。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=<<;
struct zs{int too,pre;}e[maxn];int tt,last[maxn];
struct ask{int x,tim,timl,id;}b[maxn];
int B[maxn];
int ch[maxn][],fail[maxn],dl[maxn],cnt;
int dfn[maxn],mp[maxn],TIME,L[maxn],R[maxn],TIM;
int pos[maxn],pos1[maxn],tim1[maxn],a[maxn];
int i,j,k,n,m;
ll sum,an[maxn];
bool u[maxn]; int ra;char rx;
inline int read(){
rx=getchar(),ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
} void dfs(int x){
L[x]=++TIM;
for(int i=last[x];i;i=e[i].pre)
dfs(e[i].too);
R[x]=TIM;//printf(" x:%d l--r:%d %d\n",x,L[x],R[x]);
}
void dfs2(int x){
dfn[x]=++TIME,mp[TIME]=x;//printf("x:%d dfn:%d\n",x,dfn[x]);
for(int i=;i<;i++)if(ch[x][i])
dfs2(ch[x][i]);
mp[++TIME]=x;
}
inline void insert(int a,int b){e[++tt].too=b,e[tt].pre=last[a],last[a]=tt;/*printf("%d-->%d\n",a,b);*/} int t[maxn],t1[maxn];
inline void add1(int x){/*printf(" add1:%d\n",x);*/while(x<=cnt)t1[x]++,x+=x&-x;}
inline void del1(int x){/*printf(" del1:%d\n",x);*/while(x<=cnt)t1[x]--,x+=x&-x;}
inline int get1(int l,int r){
int sm=;//printf(" get1:%d--%d",l,r);
l--;while(l)sm-=t1[l],l-=l&-l;
while(r)sm+=t1[r],r-=r&-r;/*printf(": %d\n",sm);*/return sm;
} inline int get(int x){
// printf("get:%d",x);
int sm=;while(x)sm+=t[x],x-=x&-x;//printf(" %d\n",sm);
return sm;
}
inline void add(int l,int r){
if(!l)return;//printf("add: %d--%d\n",l,r);
sum+=get1(l,r);
while(l<=cnt)t[l]++,l+=l&-l;
r++;while(r<=cnt)t[r]--,r+=r&-r;
}
inline void del(int l,int r){
if(!l)return;//printf("del: %d--%d\n",l,r);
sum-=get1(l,r);
while(l<=cnt)t[l]--,l+=l&-l;
r++;while(r<=cnt)t[r]++,r+=r&-r;
} void getfail(){
int l=,r=,i,p,now,j;dl[]=;
while(l<r){
now=dl[++l];
for(i=;i<;i++)if(ch[now][i]){
dl[++r]=j=ch[now][i];
for(p=fail[now];p&&!ch[p][i];p=fail[p]);
fail[j]=!now?:ch[p][i],insert(fail[j],j);
}
}
} bool cmp(ask a,ask b){
return B[a.timl]==B[b.timl]?(B[a.tim]==B[b.tim]?a.x<b.x:B[a.tim]<B[b.tim]):B[a.timl]<B[b.timl];
}
int main(){
m=read();char id[],c[];int x,tm=,numb=,n=,n1=;
for(i=;i<=m;i++){
scanf("%s",id);
if(id[]=='I'){
n++,scanf("%s",c),c[]-='a',x=read();
if(!ch[pos[x]][c[]])ch[pos[x]][c[]]=++cnt;//printf(" .. %d %d\n",pos[x],c[0]);
pos[n]=ch[pos[x]][c[]];//,tim[n]=tm;
}
if(id[]=='A'){
n1++,scanf("%s",c),c[]-='a',x=read();
if(!ch[pos1[x]][c[]])ch[pos1[x]][c[]]=++cnt;//,printf(" %d %d\n",pos1[x],c[0]);
pos1[n1]=ch[pos1[x]][c[]],tim1[n1]=tm;
}
if(id[]=='S')
tm++,a[tm]=pos[read()];
if(id[]=='Q')
b[++numb].x=read(),b[numb].tim=tm,b[numb].timl=tim1[b[numb].x]+,b[numb].id=numb;
}
cnt++;
getfail();
dfs(),dfs2();int kuai=(int)pow(tm,1.8/)+;
for(i=;i<=tm+;i++)B[i]=(i+kuai-)/kuai;
for(i=;i<=numb;i++)b[i].x=dfn[pos1[b[i].x]];
sort(b+,b++numb,cmp); int l=,r=,pos=;L[]=R[]=,u[mp[]]=;
for(i=;i<=numb;i++){
// printf("ask: %d--%d %d--%d x:%d sum:%lld\n",b[i].timl,b[i].tim,B[b[i].timl],B[b[i].tim],b[i].x,sum);
while(l>b[i].timl)l--,add(L[a[l]],R[a[l]]);
while(r<b[i].tim)r++,add(L[a[r]],R[a[r]]);
while(l<b[i].timl)del(L[a[l]],R[a[l]]),l++;
while(r>b[i].tim)del(L[a[r]],R[a[r]]),r--;//printf("sum: %lld\n",sum);
while(pos>b[i].x){
if(u[mp[pos]])sum-=get(L[mp[pos]]),del1(L[mp[pos]]);else sum+=get(L[mp[pos]]),add1(L[mp[pos]]);
u[mp[pos]]^=,pos--;
}
while(pos<b[i].x){
pos++;//printf("x: %d dfn:%d L:%d\n",mp[pos],pos,L[mp[pos]]);
if(u[mp[pos]])sum-=get(L[mp[pos]]),del1(L[mp[pos]]);else sum+=get(L[mp[pos]]),add1(L[mp[pos]]);
u[mp[pos]]^=;
}
an[b[i].id]=sum;
}
for(i=;i<=numb;i++)printf("%lld\n",an[i]);
}

[51nod Round15 E ]Danganronpa的更多相关文章

  1. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  2. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  3. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  4. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

  5. 51nod算法马拉松15

    智力彻底没有了...看来再也拿不到奖金了QAQ... A B君的游戏 因为数据是9B1L,所以我们可以hash试一下数据... #include<cstdio> #include<c ...

  6. 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...

  7. 【51Nod 1622】【算法马拉松 19C】集合对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...

  8. 【51Nod 1616】【算法马拉松 19B】最小集合

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...

  9. 【51Nod 1674】【算法马拉松 19A】区间的价值 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...

随机推荐

  1. 免费SSL&付费SSL证书,该如何选择?

    近年来Google.Apple.百度等公司不断推动 HTTPS 的普及,SSL 证书作为 HTTPS 安全协议的必备配置,自然也成为了网站.App 开发者最重要部署项目之一. 又拍云于 2016 年联 ...

  2. Python 项目实践二(下载数据)第三篇

    接着上节继续学习,在本章中,你将从网上下载数据,并对这些数据进行可视化.网上的数据多得难以置信,且大多未经过仔细检查.如果能够对这些数据进行分析,你就能发现别人没有发现的规律和关联.我们将访问并可视化 ...

  3. bzoj 1196: [HNOI2006]公路修建问题

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织 ...

  4. ElasticSearch 学习记录之如任何设计可扩容的索引结构

    扩容设计 扩容的单元 一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合 一个分片即为 扩容的单元 . 一个最小的索引拥有一个分片. 一个只有一个分片的索引 ...

  5. Jmeter 创建FTP测试计划

    FTP服务主要提供上传和下载功能. 操作步骤: 1.创建一个线程组 2.线程组--->添加--->配置元件--->FTP请求缺省值:输入服务器名称或IP. 3.线程组--->添 ...

  6. Parallels Desktop 12

    我微新solq123987654 备注:PD 科普:PD12有什么用,PD是让mac系统可以运行wind系统的软件,如果你不习惯mac os 或工作需要那PD绝对是个好软件正版要七八百授权,只要十五就 ...

  7. K:java中正则表达式的使用说明及其举例

    从Java1.4起,java核心API就引入了java.util.regex程序包来处理正则表达式,并使用该包下的相关类进行字符串的匹配.搜索.提取.分析结构化内容等工作.需要注意的是,正则表达式本身 ...

  8. css3毛玻璃模糊效果

    CSS3 blur滤镜实现如下测试代码: .blur { -webkit-filter: blur(10px); /* Chrome, Opera */ -moz-filter: blur(10px) ...

  9. XML文件解析数据结构

    最近在解析Android安装包内经过编译的二进制XML文件时想在内存中建立起其对应的树结构. 想了一早晨,思路如下图. 多叉树中的每个节点除了有子节点和兄弟节点以外还有一个指针指向父节点,然后根据状态 ...

  10. js介绍

    ---恢复内容开始--- js介绍 最近学习了js,那么我今天给大家介绍下js.希望对初学者有些帮助. js就是常说的JavaScript.JavaScript是目前世界上最流行的编程语言之一.这门语 ...