1. 程式人生 > >BZOJ 4896 [Thusc2016]補退選 (Trie樹維護vector)

BZOJ 4896 [Thusc2016]補退選 (Trie樹維護vector)

sub names pri 記錄操作 return scanf line code query

題目大意:略

這竟然是$thusc$的題...

先把詢問裏加入的串全拎出來,建出$Trie$樹,$Trie$裏每個節點都開一個$vector$記錄操作標號,再記錄操作數量$sum$

然後瞎**搞搞就行了

又水了一篇博客

 1 #include <cmath>
 2 #include <queue>
 3 #include <vector>
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <algorithm>
 7 #define N1 100100
 8
#define N2 6001000 9 #define MM 100 10 #define ll long long 11 #define dd double 12 #define uint unsigned int 13 #define mod 1000000007 14 #define idx(X) (X-‘a‘) 15 using namespace std; 16 17 char str[MM]; 18 19 struct Trie{ 20 int ch[N2][10],sum[N2],tot; 21 vector<int>s[N2]; 22 void insert(int
len) 23 { 24 int x=0; 25 for(int i=1;i<=len;i++){ 26 if(!ch[x][idx(str[i])]) 27 ch[x][idx(str[i])]=++tot; 28 x=ch[x][idx(str[i])]; 29 } 30 } 31 void add(int len,int id) 32 { 33 int x=0; 34 for(int i=1;i<=len;i++){ 35 x=ch[x][idx(str[i])];
36 if(sum[x]==s[x].size()) 37 s[x].push_back(id); 38 sum[x]++; 39 } 40 } 41 void sub(int len) 42 { 43 int x=0; 44 for(int i=1;i<=len;i++){ 45 x=ch[x][idx(str[i])]; 46 sum[x]--; 47 } 48 } 49 int query(int len,int w) 50 { 51 int x=0; 52 for(int i=1;i<=len;i++){ 53 x=ch[x][idx(str[i])]; 54 if(!x) return -1; 55 } 56 if(s[x].size()<w) return -1; 57 return s[x][w]; 58 } 59 }T; 60 int st[N1],ed[N1],p[N1],cnt; 61 int A[N1],B[N1],C[N1]; 62 char Q[N2],tmp[MM]; 63 64 int main() 65 { 66 int n; 67 scanf("%d",&n); 68 for(int i=1;i<=n;i++) 69 { 70 scanf("%d",&p[i]); 71 scanf("%s",str+1); 72 int len=strlen(str+1),j=1; 73 st[i]=cnt+1; 74 while(j<=len) 75 Q[++cnt]=str[j],j++; 76 ed[i]=cnt; 77 if(p[i]==1){ 78 T.insert(len); 79 }else if(p[i]==3){ 80 scanf("%d%d%d",&A[i],&B[i],&C[i]); 81 } 82 } 83 int ans=0,w; 84 for(int i=1;i<=n;i++) 85 { 86 for(int j=st[i];j<=ed[i];j++) 87 str[j-st[i]+1]=Q[j]; 88 if(p[i]==1){ 89 T.add(ed[i]-st[i]+1,i); 90 }else if(p[i]==2){ 91 T.sub(ed[i]-st[i]+1); 92 }else{ 93 w=(1ll*A[i]*abs(ans)+B[i])%C[i]; 94 ans=T.query(ed[i]-st[i]+1,w); 95 printf("%d\n",ans); 96 } 97 } 98 return 0; 99 }

BZOJ 4896 [Thusc2016]補退選 (Trie樹維護vector)