fox
Posted miracevin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fox相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100000+5;
int n,m;
int sum;
struct node{
int sub,key;
int ans;
}que[N];
//trie&&AC machine
int ch[N][26];
bool has[N][26];
int tot;
int fail[N];
int fa[N];
vector<int>mem[N];
int on[N];
char s[N];
bool exi[N];
void pre(){
int now=0;
fa[0]=0;
for(int i=1;i<=n;i++){
if(s[i]==‘P‘){
sum++;
on[sum]=now;
exi[now]=1;
}
else if(s[i]==‘B‘){
now=fa[now];
}
else{
int x=s[i]-‘a‘;
if(!ch[now][x]) ch[now][x]=++tot,fa[ch[now][x]]=now;
now=ch[now][x];
}
}
}
void che(int x){
for(int i=0;i<=25;i++){
if(ch[x][i]){
che(ch[x][i]);
if(exi[ch[x][i]]) has[x][i]=1;
exi[ch[x][i]]|=exi[ch[x][i]];
}
}
}
//fail tree
struct edge{
int nxt,to;
}e[2*N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int dfn[N],dfn2[N];
int df;
void dfs(int x,int fa){
dfn[x]=++df;
for(int i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa)continue;
dfs(y,x);
}
dfn2[x]=df;
}
void build(){
queue<int>q;
for(int i=0;i<=25;i++){
if(has[0][i]) fail[ch[0][i]]=0,add(0,ch[0][i]),q.push(ch[0][i]);
}
while(!q.empty()){
int x=q.front();q.pop();
for(int i=0;i<=25;i++){
if(has[x][i]){
cout<<x<<" -> "<<ch[x][i]<<endl;
fail[ch[x][i]]=ch[fail[x]][i];
q.push(ch[x][i]);
add(ch[fail[x]][i],ch[x][i]);
}
else{
ch[x][i]=ch[fail[x]][i];
}
}
}
}
//array tree
int f[N];
void upda(int x,int c){
for(;x<=n;x+=x&(-x)) f[x]+=c;
}
int query(int x){
int ret=0;for(;x;x-=x&(-x)) ret+=f[x];return ret;
}
//ans
void sol(int x,int fa){
cout<<"x "<<x<<" "<<dfn[x]<<endl;
upda(dfn[x],1);
for(int i=0;i<mem[x].size();i++){
cout<<i<<endl;
int son=on[que[mem[x][i]].sub];
int kk=query(dfn2[son])-query(dfn[son]-1);
que[mem[x][i]].ans=kk;
}
for(int i=0;i<=25;i++){
if(has[x][i]){
cout<<" ch "<<ch[x][i]<<endl;
sol(ch[x][i],x);
}
}
upda(dfn[x],-1);
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
pre();
che(0);
build();
dfs(0,0);//warning root is 0
//cout<<" trie tot "<<tot<<endl;
//for(int i=1;i<=tot;i++){
// cout<<i<<" : "<<fail[i]<<" "<<exi[i][0]<<endl;
///}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&que[i].sub,&que[i].key);
que[i].ans=0;
mem[on[que[i].key]].push_back(i);
}
cout<<" sum "<<sum<<endl;
//for(int i=1;i<=sum;i++)cout<<on[i]<<" ";cout<<endl;
//cout<<" mem "<<endl;
for(int i=1;i<=tot;i++){
cout<<i<<" : "<<exi[i]<<" "<<dfn[i]<<" "<<dfn2[i]<<endl;
}
sol(0,0);
for(int i=1;i<=m;i++){
printf("%d
",que[i].ans);
}
return 0;
}
aPaPBbPaPBBBbaPaPBBbPaP
44
8 8
7 7
5 5
7 8
1 6
8 8
1 8
4 4
7 8
5 8
1 5
3 4
1 5
7 7
5 6
1 2
2 2
5 6
1 4
1 1
1 4
2 6
3 3
1 3
1 6
1 1
1 8
2 6
1 8
1 2
1 4
1 2
5 8
2 2
1 1
2 2
5 8
7 8
5 5
1 6
7 7
6 6
3 4
1 4
以上是关于fox的主要内容,如果未能解决你的问题,请参考以下文章