QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#378732#8576. Symphony in c++ majorucup-team052#ML 0ms0kbC++232.0kb2024-04-06 14:24:312024-04-06 14:24:33

Judging History

你现在查看的是最新测评结果

  • [2024-04-06 14:24:33]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-04-06 14:24:31]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define N 500005
int mat[8]={0,1,2,3,0,3,2,4};
struct Node
{
	int f[5][8];
	Node() {memset(f,-1,sizeof(f)); f[4][7]=0;}
};
int n,Q;
char s[N],nw[N],inp[N];
Node merge(Node x,Node y)
{
	Node ans;
	for(int i=0;i<5;i++) for(int j=0;j<8;j++)
	{
		ans.f[i][j]=max(ans.f[i][j],x.f[i][j]);
		ans.f[i][j]=max(ans.f[i][j],y.f[i][j]);
		for(int k=0;k<8;k++)
		{
			if(x.f[i][k]!=-1&&y.f[mat[k]][j]!=-1) ans.f[i][j]=max(ans.f[i][j],x.f[i][k]+y.f[mat[k]][j]);
		}
	}
	return ans;
}
Node getch(char c)
{
	Node ans;
	if(c=='d') ans.f[4][0]=1;
	if(c=='r') ans.f[4][1]=1;
	if(c=='m') ans.f[4][2]=1;
	if(c=='f') ans.f[4][3]=1;
	if(c=='s') ans.f[4][4]=1;
	if(c=='l') ans.f[4][5]=1;
	if(c=='t') ans.f[4][6]=1;
	if(c=='o') ans.f[0][7]=1;
	if(c=='e') ans.f[1][7]=1;
	if(c=='i') ans.f[2][7]=1;
	if(c=='a') ans.f[3][7]=1;
	return ans;
}
struct SMT
{
	Node t[N*4];
	#define ls (u<<1)
	#define rs (u<<1|1)
	#define mid ((l+r)/2)
	void build(int u,int l,int r)
	{
		if(l==r)
		{
			t[u]=getch(s[l]);
			return ;
		}
		build(ls,l,mid),build(rs,mid+1,r);
		t[u]=merge(t[ls],t[rs]);
	}
	void update(int u,int l,int r,int L,int R)
	{
		if(l==r)
		{
			t[u]=getch(s[l]);
			return ;
		}
		if(mid>=L) update(ls,l,mid,L,R);
		if(mid<R) update(rs,mid+1,r,L,R);
		t[u]=merge(t[ls],t[rs]);
	}
	Node query(int u,int l,int r,int L,int R)
	{
		if(L<=l&&r<=R) return t[u];
		if(mid>=L&&mid<R) return merge(query(ls,l,mid,L,R),query(rs,mid+1,r,L,R));
		if(mid>=L) return query(ls,l,mid,L,R);
		if(mid<R) return query(rs,mid+1,r,L,R);
		assert(0);
	}
}smt;
signed main()
{
#ifdef xay5421
	freopen("a.in","r",stdin);
#endif
	cin>>n>>Q;
	scanf("%s",s+1);
	smt.build(1,1,n);
	while(Q--)
	{
		scanf("%s",inp);
		if(inp[0]=='?')
		{
			int l,r; scanf("%d %d",&l,&r);
			Node ans=smt.query(1,1,n,l,r);
			printf("%d\n",r-l+1-ans.f[4][7]);
		}
		else
		{
			int l,r;
			scanf("%d %d %s",&l,&r,inp);
			for(int i=0;i<r-l+1;i++) s[l+i]=inp[i];
			smt.update(1,1,n,l,r);
		}
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Memory Limit Exceeded

input:

8 10
eldorado
? 1 3
? 1 8
# 6 7 it
? 1 8
# 3 3 t
? 1 8
# 1 8 streamer
? 1 8
# 1 8 symphony
? 1 8

output:

3
4
6
6
6
6

result: