HDU3973 AC's String(线段树维护hash)

 

 

 

 

  1 #include<bits/stdc++.h>
  2 #define ull unsigned long long
  3 using namespace std;
  4 const int N=500011,L=2000011;
  5 const ull St=233;
  6 int T,n,m;
  7 ull jc[N];
  8 char ss[L],s[L];
  9 set<ull> q;
 10 
 11 struct Node {
 12     int l,r;
 13     ull data;
 14 };
 15 Node t[N];
 16 
 17 inline int re_ad() {
 18     char ch=getchar(); int x=0,f=1;
 19     while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
 20     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 21     return x*f;
 22 }
 23 
 24 inline void init() {
 25     jc[0]=1;
 26     for(int i=1;i<=strlen(s+1);++i) jc[i]=jc[i-1]*St;
 27 }
 28 
 29 inline ull get_hash() {
 30     ull res=0;
 31     for(int i=0;i<strlen(ss);++i) res=res*St+ss[i]-'a'+1;
 32     return res;
 33 }
 34 
 35 inline void pushup(int d) {
 36     int mid=(t[d].l+t[d].r)>>1;
 37     t[d].data=t[d<<1].data*(ull)(t[d].r-mid)*St+t[d<<1|1].data;
 38 }
 39 
 40 void build(int d,int x,int y) {
 41     t[d].l=x,t[d].r=y;
 42     if(x==y) {
 43         t[d].data=(ull)(s[x]-'a'+1);
 44         return ;
 45     }
 46     int mid=(x+y)>>1;
 47     build(d<<1,x,mid);
 48     build(d<<1|1,mid+1,y);
 49     pushup(d);
 50 }
 51 
 52 void update(int d,int x,ull y) {
 53     if(t[d].l==t[d].r) {
 54         t[d].data=y;
 55         return ;
 56     }
 57     int mid=(t[d].l+t[d].r)>>1;
 58     if(x<=mid) update(d<<1,x,y);
 59     else update(d<<1|1,x,y);
 60     pushup(d);
 61 }
 62 
 63 ull query(int d,int x,int y) {
 64     if(x<=t[d].l && t[d].r<=y) {
 65         return t[d].data;
 66     }
 67     int mid=(t[d].l+t[d].r)>>1;
 68     ull res=0;
 69     if(mid>=y) return query(d<<1,x,y);
 70     if(mid<x) return query(d<<1|1,x,y);
 71     return query(d<<1,x,mid)*jc[y-mid]+query(d<<1|1,mid+1,y);
 72 }
 73 
 74 inline void Query(int x,int y) {
 75     ull res=query(1,x,y);
 76 //    printf("%llu ",res);
 77     set<ull>::iterator it=q.find(res);
 78     if(it==q.end()) printf("No\n");
 79     else printf("Yes\n");
 80 }
 81 
 82 int main()
 83 {
 84     char goal,z;
 85     int x,y;
 86     init();
 87     T=re_ad();
 88     while(T--) {
 89         memset(t,0,sizeof(t));
 90         q.clear();
 91         n=re_ad();
 92         for(int i=1;i<=n;++i) scanf("%s",ss),q.insert(get_hash());
 93         scanf("%s",s+1);
 94         build(1,1,strlen(s+1));
 95         m=re_ad();
 96         for(int i=1;i<=m;++i) {
 97             goal='0';
 98             while(goal!='Q' && goal!='C') goal=getchar();
 99             if(goal=='C') {
100                 x=re_ad(); z='0';
101                 while(z<'a' || z>'z') z=getchar();
102                 update(1,x+1,(ull)(z-'a'+1));
103             }
104             else x=re_ad(),y=re_ad(),Query(x+1,y+1);
105         }
106     }
107 //    set<ull>::iterator iter;
108 //    for(iter=q.begin();iter!=q.end();++iter) printf("%llu ",*iter); puts("");
109     return 0;
110 }
posted @ 2021-05-29 18:15  上官书房  阅读(54)  评论(0)    收藏  举报