BZOJ 4896 [Thusc2016]补退选 (Trie树维护vector)

题目大意:略

这竟然是$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 }

 upd:数据太水了吧..我原来的代码,query函数里的特判是错的= =

posted @ 2018-11-26 20:42  guapisolo  阅读(197)  评论(0编辑  收藏  举报