码迷,mamicode.com
首页 > 其他好文 > 详细

fox

时间:2018-10-08 23:14:14      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:def   pre   query   its   bool   struct   ons   printf   scan   

#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\n",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

标签:def   pre   query   its   bool   struct   ons   printf   scan   

原文地址:https://www.cnblogs.com/Miracevin/p/9757584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!