社区讨论

95pts TLE on #12

P2292[HNOI2004] L 语言参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mm8x5pzc
此快照首次捕获于
2026/03/02 16:30
6 天前
此快照最后确认于
2026/03/05 19:20
3 天前
查看原帖
感觉该考虑的都考虑到了,但是最后一个点TLE很多
CPP
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int L=505;
const int N=2e6+5;
int n,q;
char s[25];
char t[N],dp[N];
struct IO
{
    char buf[1<<20],*p,*pp;
    IO():p(buf),pp(buf){}
    #define gc() (p==pp&&(pp=buf+fread(buf,1,1<<20,stdin),p=buf),p==pp?EOF:*p++)
    template<typename T>IO&operator>>(T&x){x=0;char c=gc();bool f=0;while(c<'0'||c>'9')f|=(c=='-'),c=gc();while(c>='0'&&c<='9')x=x*10+(c^48),c=gc();if(f)x=-x;return*this;}
    IO&operator>>(char*s){char c=gc();while(c<=32)c=gc();while(c>32)*s++=c,c=gc();*s='\0';return*this;}
}io;
#define cin io
struct AC
{
    int tr[L][26],fail[L],idx;
    int q[L],qh,qt;
    int mk[L];
    inline void insert(const char*s)
    {
        int u=0;
        for(int i=0;s[i];++i)
        {
            int v=s[i]-'a';
            if(!tr[u][v]) tr[u][v]=++idx;
            u=tr[u][v];
        }
        mk[u]|=1<<(strlen(s));
    }
    inline void build()
    {
        qh=qt=0;
        for(int i=0;i<26;i++)
            if(tr[0][i]) q[qt++]=tr[0][i];
        while(qh<qt)
        {
            int u=q[qh++];
            mk[u]|=mk[fail[u]];
            for(int i=0;i<26;i++)
            {
                if(tr[u][i])
                {
                	fail[tr[u][i]]=tr[fail[u]][i];
					q[qt++]=tr[u][i];
				}
                else tr[u][i]=tr[fail[u]][i];
            }
        }
    }
}ac;
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;++i) 
	{
		cin>>s;
		ac.insert(s);
	}
	ac.build();
	while(q--)
	{
		cin>>t;
		int m=strlen(t);
		memset(dp,0,m+1);
		dp[0]=1;
		int u=0,ans=0;
		for(int i=0;i<m;++i)
		{
			int c=t[i]-'a';
			u=ac.tr[u][c];
			int msk=ac.mk[u];
			if(msk)
				for(int l=1;l<=20;++l)
					if((msk>>l)&1) 
					{
						int pre=i+1-l;
						if(pre>=0&&dp[pre])
						{
							dp[i+1]=1,ans=i+1;
							break;
						}
					}
		}
		printf("%d\n",ans);
	}
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...