萌新TLE50
查看原帖
萌新TLE50
71548
StarKnight楼主2018/12/23 19:29
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int ans,cnt,nxt[N],ch[N][30]={0},bo[N],que[N];
char s[N<<1];
void make_trie(char *s)
{
    int u=1,c,len=strlen(s),i;
    for(i=0;i<len;++i)
    {
        c=s[i]-'a';
        if(!ch[u][c])ch[u][c]=++cnt;
        u=ch[u][c];
    }
    ++bo[u];return;
}
void bfs()
{
    int q1,q2,u,v,i;
    for(i=0;i<26;++i)ch[0][i]=1;
    que[1]=1;nxt[1]=0;
    for(q1=1,q2=1;q1<=q2;++q1)
    {
        u=que[q1];
        for(i=0;i<26;++i)
        {
            if(!ch[u][i])ch[u][i]=ch[nxt[u]][i];
            else
            {
                que[++q2]=ch[u][i];
                nxt[ch[u][i]]=ch[nxt[u]][i];
            }
        }
    }
}
void find(char *s)
{
    int u=1,len=strlen(s),c,k,i;
    for(i=0;i<=len;++i)
    {
        c=s[i]-'a';
        k=ch[u][c];
        while(k>1)
        {
            ans+=bo[k];
            bo[k]=0;
            k=nxt[k];
        }
        u=ch[u][c];
    }
    return ;
}
int main()
{
    int n,i;
    ans=0;cnt=1;
    for(i=0;i<26;++i)ch[0][i]=1;
    scanf("%d",&n);
    for(i=1;i<=n;++i)scanf("%s",s),make_trie(s);
    bfs();
    scanf("%s",s);
    find(s);
    printf("%d\n",ans);
    return 0;
}

第一个点T掉了,本机加文件输入输出会长时间不结束运行,如果在exe文件中输入则不会,求解QwQ

2018/12/23 19:29
加载中...