1 条题解

  • 0
    @ 2025-10-8 17:03:23
    #include<bits/stdc++.h>
    using namespace std;
    const int N=25*15;
    char s[25],t[(1<<20)+10];
    int ch[N][26],id,ed[N],pre[N];
    void ins(char *s)
    {
        int p=0,len=strlen(s);
        for(int i=0;s[i];i++)
        {
            int j=s[i]-'a';
            if(ch[p][j]==0) ch[p][j]=++id;
            p=ch[p][j];
        }
        ed[p]|=1<<(len-1);
    }
    void build()
    {
        queue<int> Q;
        for(int i=0;i<26;i++)if(ch[0][i])Q.push(ch[0][i]);
        while(!Q.empty())
        {
            int x=Q.front();Q.pop();
            ed[x]|=ed[pre[x]];
            for(int i=0;i<26;i++)
            {
                int &y=ch[x][i];
                if(y==0)     y=ch[pre[x]][i];
                else    pre[y]=ch[pre[x]][i], Q.push(y); 
            }
        }
    }
    int query(char *s)
    {
        int p=0,ans=0,cur=1; 
        for(int i=0;s[i];i++)
        {
            p=ch[p][s[i]-'a'];
            if(cur&ed[p])cur=cur<<1|1,ans=i+1;
    		else         cur<<=1;
        }
        return ans;
    }
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        id=0;memset(ch,0,sizeof(ch));memset(ed,0,sizeof(ed)); 
        for(int i=1;i<=n; i++)
        {
    		scanf("%s",s);
    		ins(s);
    	}
        memset(pre,0,sizeof(pre));build();
        while(m--)
    	{
    		scanf("%s",t); 
    		printf("%d\n",query(t));
    	}
        return 0;
    }
    
    • 1

    信息

    ID
    2865
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    104
    已通过
    21
    上传者