1 条题解
-
0
随机跳题不看标签之人已重生。
看题第一眼:神秘数据结构?区修区查?好麻烦啊。
如何判断一个字符串是否为回文串?
方法 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
- 上传者