1 条题解

  • 0
    @ 2026-6-26 21:25:28

    随机跳题不看标签之人已重生。

    看题第一眼:神秘数据结构?区修区查?好麻烦啊。

    如何判断一个字符串是否为回文串?

    方法 1:对比每一个字母,一看就不行。

    方法 2:正反哈希是否相等。

    好了我觉得我不需要继续讲了。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=1e6+10,B=131,P=998244353;
    int c1[N],c2[N],n,q;char st[N];
    int qpow(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P;return ans;}
    void add(int c[],int x,int k){for(;x<=n;x+=x&-x)c[x]=((c[x]+k)%P+P)%P;}
    int get(int c[],int x){int ans=0;for(;x;x-=x&-x)ans=(ans+c[x])%P;return ans;}
    signed main()
    {
    	cin>>n>>q;scanf("%s",st+1);
    	for(int i=1;i<=n;i++)
    	{
    		add(c1,i,st[i]*qpow(B,i)%P);
    		add(c2,n-i+1,st[i]*qpow(B,n-i+1)%P);
    	}
    	while(q--)
    	{
    		int op;cin>>op;
    		if(op==1)
    		{
    			int x;string s;cin>>x>>s;
    			add(c1,x,(s[0]-st[x])*qpow(B,x)%P);
    			add(c2,n-x+1,(s[0]-st[x])*qpow(B,n-x+1)%P);
    			st[x]=s[0];
    		}
    		else
    		{
    			int l,r;cin>>l>>r;
    			int sum1=((get(c1,r)-get(c1,l-1))%P+P)%P,sum2=((get(c2,n-l+1)-get(c2,n-r))%P+P)%P;
    			sum1=sum1*qpow(qpow(B,l-1),P-2)%P;sum2=sum2*qpow(qpow(B,n-r),P-2)%P;
    			if(sum1==sum2)cout<<"Yes"<<'\n';
    			else cout<<"No"<<'\n';
    		}
    	}
    	return 0;
    }
    • 1

    信息

    ID
    8295
    时间
    3000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    7
    已通过
    3
    上传者