记录编号 443262 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2017]蚯蚓排队 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 6.994 s
提交时间 2017-08-30 09:45:48 内存使用 931.08 MiB
显示代码纯文本
//pretest passed
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int read(){
	int x=0;bool sign=0;
	char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return sign?-x:x;
}
typedef long long ll;
const int N=5e5+10,p=119<<23|1;
int inc(int x,int y){x+=y;return x>=p?x-p:x;}
int dec(int x,int y){x-=y;return x<0?x+p:x;}
int mul(int x,int y){return (ll)x*y%p;}
int n,m,maxk,c[N],nxt[N],pre[N];
const int nodes=3e7+10;
int go[nodes][6],cnt[nodes],fail[nodes],top=1;
int extend(int p,int w){
	if (!go[p][w]) fail[go[p][w]=++top]=go[fail[p]][w];
	return go[p][w];
}
int tp,x,y,k;
const int length=1e7+10;
char s[length];
int main()
{
	freopen("2017queue.in","r",stdin);
	freopen("2017queue.out","w",stdout);
	scanf("%d%d",&n,&m);
	if (m<=300000) maxk=50;else maxk=1;
	for (int i=0;i<6;i++) fail[go[1][i]=++top]=1;
	for (int i=1;i<=n;i++) c[i]=read(),++cnt[go[1][c[i]-1]];
	for (int i=1;i<=m;i++){
		tp=read();
		if (tp==1){
			x=read();y=read();
			nxt[x]=y;pre[y]=x;
			for (int i=1;i<maxk&&x;i++,x=pre[x]){
				int p=1,now=x;
				for (int j=1;j<=i;j++){
					int w=c[now]-1;
					p=extend(p,w);
					now=nxt[now];
				}
				for (int j=i+1;now&&j<=maxk;j++){
					int w=c[now]-1;
					p=extend(p,w);
					cnt[p]++;
					now=nxt[now];
				}
			}
		}
		if (tp==2){
			x=read();y=nxt[x];
			for (int i=1;i<maxk&&x;i++,x=pre[x]){
				int p=1,now=x;
				for (int j=1;j<=i;j++){
					int w=c[now]-1;
					p=extend(p,w);
					now=nxt[now];
				}
				for (int j=i+1;now&&j<=maxk;j++){
					int w=c[now]-1;
					p=extend(p,w);
					cnt[p]--;
					now=nxt[now];
				}
			}
			nxt[pre[y]]=0;pre[y]=0;
		}
		if (tp==3){
			scanf("%s",s+1);
			k=read();
			n=strlen(s+1);s[n+1]=1;
			int ans=1,p=1;
			for (int i=1;i<=k;i++) p=go[p][s[i]-'1'];
			for (int i=k+1;i<=n+1;i++) ans=mul(ans,cnt[p]),p=go[fail[p]][s[i]-'1'];
			printf("%d\n",ans);
		}
	}
	return 0;
}