这是之前的代码:
#include <bits/stdc++.h>
#define ri register int
#define MAXN 100005
#define MAXM 100001
#define g() getchar()
#define pc(a) putchar(a)
#define Tp template<typename T>
using namespace std;
const int inf=0x3f3f3f3f;
namespace SlowIO
{
Tp inline void rd(T &x) {
x=0;char i=g();bool f=1;
while(!isdigit(i)) f&=(i!='-'),i=g();
while(isdigit(i)) x=(x<<3)+(x<<1)+(i^48),i=g();
x*=((f<<1)-1);
}
Tp inline void op(T x){
if(x<0) pc('-'),x=-x;
if(x>=10) op(x/10);
pc(x%10+48);
}
Tp inline void writeln(T x){op(x);pc('\n');}
Tp inline void writesp(T x){op(x);pc(' ');}
};
using namespace SlowIO;
const int mod=19260817;
const int p=233;
int n,m;
char words[101],passage[101];
int hushw[MAXN];
int flag[19260818];
bool vis[19260818];
int hushp[MAXM];
int mi,xi;
int f[MAXM];
int main()
{
ri len=0,temp=0;
rd(n);
for(ri i=1;i<=n;i++){
scanf("%s",words);
len=strlen(words);
for(ri j=0;j<len;j++)
temp=(temp*p+(words[j]^'a'))%mod;
flag[temp]=i;
hushw[i]=temp,temp=0;
}
rd(m);
for(ri i=1;i<=m;i++){
scanf("%s",passage);
len=strlen(passage);
for(ri j=0;j<len;j++)
temp=(temp*p+(passage[j]^'a'))%mod;
hushp[i]=temp;
f[i]=f[i-1];
if(flag[temp]){
if(!vis[temp]){
vis[temp]=1;
if(!f[i]) mi=i;
f[i]++;
xi=i;
}
}
if(f[i]==f[i-1]&&f[i]==f[mi]) mi=i;
temp=0;
}
writeln(f[xi]),op((f[xi]?(xi-mi):0));
return 0;
}
思路是读入m的时候直接处理,查找输入的文章单词是否是单词池里的词
如果是的话判断是否之前输入过同一个词
然后处理出一个前缀和数组,f[x]
表示到x
位置时文章能够覆盖的最多单词
最后把俩指针一减就是区间长度.
但是……它wsm会RE啊???
就在刚才我开了long long
,然后RE的点就变成了WA(
求巨捞指教(