这道题 求一位卡常大佬
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=25,M=2e6+5;
int n,m,l[N];
bool dp[M];
ull hs[N],ht[M],pw[M];
ull query(int l,int r){return ht[r]-ht[l-1]*pw[r-l+1];}
void solve()
{
memset(dp,0,sizeof dp);
string s;
cin>>s;
int len=s.size(),ans=0;
s="#"+s;
for(int i=1;i<=len;++i)
ht[i]=ht[i-1]*131+s[i];
dp[0]=1;
for(int i=0;i<=len;++i)
for(int j=1;j<=n;++j)
{
if(i+l[j]>len)
continue;
if(query(i+1,i+l[j])==hs[j])
dp[i+l[j]]|=dp[i];
}
for(int i=len;i>=0;--i)
if(dp[i])
{
cout<<i<<'\n';
return ;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
pw[0]=1;
for(int i=1;i<M;++i)
pw[i]=pw[i-1]*131;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
string s;
cin>>s;
l[i]=s.size();
s="#"+s;
for(int j=1;j<=l[i];++j)
hs[i]=hs[i]*131+s[j];
}
while(m--)
solve();
}
TLE #10 #11 #12