• 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
    ",ans);
    96         }
    97     }
    98     return 0;
    99 }

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

  • 相关阅读:
    一天一个 Linux 命令(44):ifstat 命令
    Java集合框架示意图
    Java中String类常见问题汇总
    一天一个 Linux 命令(43):netstat 命令
    Windows系统下,如何设置maven字符编码
    Java文件操作编程
    Java 注解(Annotation)
    Linux Centos7.4 更新Java jdk版本
    Java基础(6)Java数据类型扩展
    Windows系统下Elasticsearch7.15.2单服务器配置多节点
  • 原文地址:https://www.cnblogs.com/guapisolo/p/10022801.html
Copyright © 2020-2023  润新知