MnZn求助模拟赛T3
  • 板块题目总版
  • 楼主atarashiTLE
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/5 21:45
  • 上次更新2023/11/2 15:23:32
查看原帖
MnZn求助模拟赛T3
299922
atarashiTLE楼主2023/10/5 21:45

Rt.其实不是你谷的。

对不起标题党了,但是真的没人进。

P3823 蚯蚓排队 4pts code如下。

#include<bits/stdc++.h>
#define int long long
#define N 200010
#define MOD 998244353
using namespace std;
unordered_map<string,int> hs;
int n,m,K=50,a[N],op,aa,bb,bla,blb,beg,endd,ans,k,nxt[N],lst[N],sz[N],it[N];string s,tmp[N];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie();cout.tie();
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i],nxt[i]=lst[i]=0,hs[(tmp[0]+(char)(a[i]+'0'))]++,sz[i]=1;
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
 			cin>>aa>>bb;
 			for(int j=bb;j;j=nxt[j])
			 	endd=j;
 			tmp[1]=(char)(a[bb]+'0');
			for(int k=2,t=aa;k<=50;k++){
				tmp[k]=tmp[k-1]+(char)(a[t]+'0');
				it[k]=t;t=lst[t];
				if(t==0)break;
			}int j;
			for(j=2;j<=50;j++){
 				reverse(tmp[j].begin(),tmp[j].end());
				int t=it[j],bac=bb;
				if(!t)break;
				hs[tmp[j]]++;
				if(hs[tmp[j]]>MOD)hs[tmp[j]]-=MOD;
				if(bac!=endd)
				while((t=nxt[t])){
					bac=nxt[bac];
					tmp[j].erase(tmp[j].begin());
					tmp[j]+=(char)(a[bac]+'0');
					hs[tmp[j]]++;
					if(hs[tmp[j]]>MOD)hs[tmp[j]]-=MOD;
					if(bac==endd)break;
				}
			}
			for(;j<=50;j++){
				if(nxt[it[j-1]]==0)break;
				tmp[j]=tmp[j-1]+(char)(a[nxt[it[j-1]]]+'0');
				hs[tmp[j]]++;
			}
 			nxt[aa]=bb;lst[bb]=aa;
		}
		if(op==2){
			cin>>aa;
			bb=nxt[aa];
 			for(int j=bb;j;j=nxt[j])endd=j;
 			tmp[1]=(char)(a[bb]+'0');
 			int k,t,j;
			for(k=2,t=aa;k<=50;k++){
				tmp[k]=tmp[k-1]+(char)(a[t]+'0');
				it[k]=t;t=lst[t];
				if(t==0)break;
			}nxt[aa]=lst[bb]=0;
			for(j=2;j<=50;j++){
 				reverse(tmp[j].begin(),tmp[j].end());
				int t=it[j],bac=bb;
				if(!t){
					break;
				}
				hs[tmp[j]]--;
				if(bac!=endd)
				while((t=nxt[t])){
					bac=nxt[bac];
					tmp[j].erase(tmp[j].begin());
					tmp[j]+=(char)(a[bac]+'0');
					hs[tmp[j]]--;
					if(bac==endd)break;
				}
			}
			for(;j<=50;j++){
				if(nxt[it[j-1]]==0)break;
				tmp[j]=tmp[j-1]+(char)(a[nxt[it[j-1]]]+'0');
				hs[tmp[j]]--;
			}
		}
		if(op==3){
			cin>>s>>k;ans=1;
			tmp[0]="";
			for(int j=0;j<k;j++)
				tmp[0]+=s[j];
			ans*=hs[tmp[0]]%MOD;
			for(unsigned int j=k;j<s.size();j++){
				tmp[0].erase(tmp[0].begin());
				tmp[0]+=s[j];
				ans=ans*hs[tmp[0]]%MOD;
			}
			cout<<ans<<endl;
		}
	}
}
*/
2023/10/5 21:45
加载中...