QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#378732 | #8576. Symphony in c++ major | ucup-team052# | ML | 0ms | 0kb | C++23 | 2.0kb | 2024-04-06 14:24:31 | 2024-04-06 14:24:33 |
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