bzoj 3439

先把所有词扔进tire,然后dfs序弄出区间,然后就是区间最大值了

主席树各种写挂QAQ

 1 #include<bits/stdc++.h>
 2 #define inc(i,l,r) for(int i=l;i<=r;i++)
 3 #define dec(i,l,r) for(int i=l;i>=r;i--)
 4 #define link(x) for(edge *j=h[x];j;j=j->next)
 5 #define mem(a) memset(a,0,sizeof(a))
 6 #define inf 1e9
 7 #define ll long long
 8 #define succ(x) (1<<x)
 9 #define lowbit(x) (x&(-x))
10 #define ida(x) (x-'a')
11 #define NM 100000+5
12 using namespace std;
13 int read(){
14     int x=0,f=1;char ch=getchar();
15     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
16     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
17     return x*f;
18 }
19 const int cnt=26;
20 struct seg{
21     int s;
22     seg *l,*r;
23 }T[100*NM],*_root[NM],*_o=T;
24 struct node{
25     vector<int >id;
26     node *c[cnt+1];
27 }N[4*NM],*o=N,*root;
28 int n,m,a[NM],in[NM],out[NM],tot,_t;
29 char st[NM];
30 void ins(int x){
31     node *r=root;
32     scanf("%s",st);m=strlen(st)-1;
33     dec(i,m,0){
34         if(!r->c[ida(st[i])])r->c[ida(st[i])]=++o;
35         r=r->c[ida(st[i])];
36     }
37     r->id.push_back(x);
38 }
39 void dfs(node *r){
40     if(!r->id.empty()){
41         int t=tot+1;
42         inc(i,0,r->id.size()-1)in[r->id[i]]=t,a[++tot]=r->id[i];
43     }
44     inc(i,0,cnt)if(r->c[i])
45     dfs(r->c[i]);
46     if(!r->id.empty())inc(i,0,r->id.size()-1)out[r->id[i]]=tot;
47 }
48 seg* mod(seg *p,int x,int y){
49     seg *r=++_o;int t=x+y>>1;
50     r->s=p->s+1;
51     r->l=p->l;r->r=p->r;
52     if(x==y)return r;
53     if(_t<=t)r->l=mod(p->l,x,t);
54     else r->r=mod(p->r,t+1,y);
55     return r;
56 }
57 int query(seg *_r,seg *r,int x,int y){
58     int t=x+y>>1,v=r->l->s-_r->l->s;
59     if(x==y)return _t==1?x:-1;
60     if(_t<=v)return query(_r->l,r->l,x,t);
61     else {_t-=v;return query(_r->r,r->r,t+1,y);}
62 }
63 int main(){
64 //    freopen("data.in","r",stdin);
65 //    freopen("test.out","w",stdout);
66     root=++o;
67     n=read();
68     inc(i,1,n)ins(i);
69     dfs(root);
70     _root[0]=++_o;_o->l=_o->r=_o;
71 /*    inc(i,1,n)printf("%d ",in[i]);putchar('
');
72     inc(i,1,n)printf("%d ",out[i]);putchar('
');
73     inc(i,1,n)printf("%d ",a[i]);putchar('
');*/
74     inc(i,1,n){
75         _t=a[i];
76         _root[i]=mod(_root[i-1],1,n);
77     }
78 //    inc(i,1,n)printf("%d ",b[i]);putchar('
');
79     inc(i,1,n){
80         _t=read();
81         if(_root[out[i]]->s-_root[in[i]-1]->s>=_t)
82         printf("%d
",query(_root[in[i]-1],_root[out[i]],1,n));
83         else printf("-1
");
84     }
85     return 0;
86 }
View Code
原文地址:https://www.cnblogs.com/onlyRP/p/5218023.html