1.BZOJ 2434 阿狸的打字机
AC自动机+树状数组
//Twenty
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=100000+29;
char s[maxn];
int tot,n,m,ecnt,fi[maxn],nx[maxn],tt[maxn],fir[maxn],nxt[maxn],to[maxn];
int ls[maxn],le[maxn],dfs_clock,sum[maxn],cnt,num[maxn],ans[maxn],xbh[maxn];
int qry(int x){
int res=0;
for(int i=x;i>0;i-=(i&(-i)))
res+=sum[i];
return res;
}
void addsum(int x,int v){
for(int i=x;i<=tot;i+=(i&(-i)))
sum[i]+=v;
}
struct Node{
int l,r,id,bh;
}qs[maxn];
struct node{
node *s[26],*fail,*fa;
int id,bh;
node(){
for(int i=0;i<26;i++) s[i]=NULL; fail=NULL; fa=NULL;
}
}*root,*now,*tep;
void add(int u,int v,int k){
nx[++ecnt]=fi[u];fi[u]=ecnt;tt[ecnt]=v; num[ecnt]=k;
}
void add_edge(int u,int v){
nxt[++cnt]=fir[u]; fir[u]=cnt; to[cnt]=v;
}
void build(){
root=new node();
root->bh=++tot;
now=root;
for(int i=0;s[i]!='