0分求助,我死了QAQ
查看原帖
0分求助,我死了QAQ
206676
YaeMik0楼主2021/10/18 11:52
#include<bits/stdc++.h>
#define N 10000005
#define Z 4
#define ll long long
#define ms(ar,x) memset(ar,x,sizeof(ar))
#define mc(ar1,ar2) memcpy(ar1,ar2,sizeof(ar2))
#define fn(i,st,ed) for(int i=st;i<=ed;i++)
#define fd(i,st,ed) for(int i=st;i>=ed;i--)
#define fg(i,x,head,e) for(int i=head[x];~i;i=e[i].nxt)
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int getnum(char c){return (c=='E'?0:(c=='S'?1:(c=='W'?2:3)));}
class TRIE{
    public:
        void insert(char *s){
            int len=strlen(s);
            int u=1;
            fn(i,0,len-1){
                int c=getnum(s[i]);
                if(!tr[u][c])tr[u][c]=++tot;
                u=tr[u][c];
            }
        }
        int query(char *s){
            int len=strlen(s);
            int ans=0,u=1;
            fn(i,0,len-1){int c=getnum(s[i]);
                u=tr[u][c];
                if(End[u])ans=i;
            }
            return ans;
        }
    protected:
        int tr[N][Z],End[N];
        int tot;
};
class Aho_Corasick_Automaton:public TRIE{
    public:
        Aho_Corasick_Automaton(){tot=1;}
        void clear(){tot=1;ms(tr,0);ms(End,0);ms(fail,0);}
        void build(){
            fn(i,0,3)tr[0][i]=1;
            q.push(1),fail[1]=0;
            while(!q.empty()){
                int u=q.front();q.pop();
                fn(i,0,3){
                    if(tr[u][i]){
                        q.push(tr[u][i]);
                        int v=fail[u];
                        //while(v>1&&!tr[v][i])v=fail[v];
                        fail[tr[u][i]]=tr[v][i];
                    }
                    else tr[u][i]=tr[fail[u]][i];
                }
            }
        }
        void pre(char *s){
            int len=strlen(s);
            int u=1;
            fn(i,0,len-1){
                int c=getnum(s[i]);u=tr[u][i];
                int k=u;
                while(k>1&&!End[k])End[k]=1,k=fail[k];
            }
        }
    private:
        queue<int>q;
        int fail[N];
};
Aho_Corasick_Automaton ACA;
char s[N],temp[100005][105];
int main(){
    int n=read(),m=read();
    scanf("%s",s);
    fn(i,1,m){
        scanf("%s",temp[i]);
        ACA.insert(temp[i]);
    }
    ACA.build();ACA.pre(s);
    fn(i,1,m)printf("%d\n",ACA.query(temp[i]));
    return 0;
}
2021/10/18 11:52
加载中...