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 }

浙公网安备 33010602011771号