社区讨论
【灵异事件】本机秒出答案,交上去T
P3823[NOI2017] 蚯蚓排队参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo8jnnn0
- 此快照首次捕获于
- 2023/10/27 19:42 2 年前
- 此快照最后确认于
- 2023/10/27 19:42 2 年前
就是第一个点,我把数据下载下来,在本机运行,发现不会T,但是交上去就是T了,以及在loj上连样例都T了,怎么回事?
CPP#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
unsigned long long vv,px,sx,x,pw[1001010];
long long P,ans,uued,suf[1001010],pre[1001010],K,len,id[1001010];
char S[1001010];
int d[30001010],b[10001010],c[10001010];
unsigned long long a[10001010];
int j,cnt,num,opt,tnum,fre[20],Testing,u,v,n,m,p,i,MOD,up,start[1001010],Kend[1001010],V[1001010];
void Insert(unsigned long long X){
int now=X % P;
for (int i=d[now];i;i=b[i]) if (a[i]==X) {c[i]++;return ;}
cnt++;a[cnt]=X;c[cnt]=1;b[cnt]=d[now];d[now]=cnt;
}
void Delete(unsigned long long X){
int now=X % P;
for (int i=d[now];i;i=b[i]) if (a[i]==X) {c[i]--;return ;}
}
long long findval(unsigned long long X){
int now=X % P;
for (int i=d[now];i;i=b[i]) if (a[i]==X) return c[i];
}
int main()
{
//freopen("P3823_1.in","r",stdin);
n=read();m=read();P=19260817;p=10;up=50;pw[0]=1;
for (i=1;i<=up;i++) pw[i]=pw[i-1]*p;
for (i=1;i<=n;i++) id[i]=read(),fre[id[i]]++,Insert(id[i]);
for (Testing=1;Testing<=m;Testing++){
opt=read();
if (opt==1){
u=read();v=read();num=0;px=sx=0;
for (i=v;i;i=suf[i])
{
num++;px=px*p+id[i];
sx=px;tnum=num;
for (j=u;j;j=pre[j]){
sx=sx+id[j]*pw[tnum];
tnum++;Insert(sx);
if (tnum>50) break;
}
}
pre[v]=u;suf[u]=v;
}
if (opt==2){
u=read();v=suf[u];num=0;px=sx=0;
for (i=v;i;i=suf[i])
{
num++;px=px*p+id[i];
sx=px;tnum=num;
for (j=u;j;j=pre[j]){
sx=sx+id[j]*pw[tnum];
tnum++;Delete(sx);
if (tnum>50) break;
}
}
suf[u]=0;pre[v]=0;
}
if (opt==3){
scanf("%s",S+1);K=read();len=strlen(S+1);
/* if (K==1){ans=1;
for (int i=1;i<=len;i++) ans=ans*fre[S[i]-'0'] % 998244353;
printf("%lld\n",ans);continue;
}*/
ans=1;vv=0;
for (i=1;i<=K;i++) vv=vv*p+S[i]-'0';
ans=ans*findval(vv) % 998244353;
for (i=K+1;i<=len;i++){
vv=(vv-(S[i-K]-'0')*pw[K-1])*p+S[i]-'0';
ans=ans*findval(vv) % 998244353;
}
printf("%lld\n",ans);
}
}
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...