学刚IO 1e-14ms,求助(之前)为什么会RE
查看原帖
学刚IO 1e-14ms,求助(之前)为什么会RE
538609
Neutralized楼主2022/1/21 11:27

这是之前的代码:

#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\huge\tt{\color{deeppink}RE}啊???
就在刚才我开了long long,然后RE\tt{\color{deeppink}RE}的点就变成了WA\tt{\color{red}WA}
求巨捞指教(

  • &:WA\tt{\color{red}WA}的全是第二行的区间长度(
    如果有巨捞帮忙查下错就更射♂射了
2022/1/21 11:27
加载中...