社区讨论
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 条回复,欢迎继续交流。
正在加载回复...