萌新求助简单数据结构和字符串的板子
查看原帖
萌新求助简单数据结构和字符串的板子
455490
Sharpsmile楼主2024/1/18 09:37

rt,如果我删掉rebuild (rb) 里面的return 的话,那么能获得54,但是如果不删就是 18。其他部分问题还没有查出来,然后替罪羊树重构的那个部分也没看出来哪里错了。

求助大佬们 qwq

Links

//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#include <bitset>
using namespace std;
#define endl "\n"
//#define int long long
//#define double long double
#define p1(x) (x).first
#define p2(x) (x).second
#define pii pair<int,int>
#define lc(x) T[x].lc
#define rc(x) T[x].rc
int n;
const double alp=3.l/4;
struct node{
    double w;
    double L,R;
    int loc;
    int siz,rsiz;
    int lc,rc;
    bool t;
}T[3000300];
int cnt=0;
int now=3e6;
char A[3000300];
int mat[3000300];
int rt=0;
inline bool cmp(node X,node Y){
    if(A[X.loc]<A[Y.loc])return 1;
    else if(A[X.loc]>A[Y.loc])return 0;
    else return T[mat[X.loc+1]].w<T[mat[Y.loc+1]].w;
}
inline bool cmp(node X,string s){
    int p=X.loc;
//    cout<<p<<" "<<s<<endl;
//    cout<<A[p]<<A[p+1]<<endl;
    for(char x:s)
        if(A[p]<x)return 1;
        else if(A[p]>x)return 0;
        else p++;
    return 0;
}
inline int nnd(int loc){
    T[++cnt]={0,0,0,loc,1,1,0,0,1};
    return cnt;
}
inline void upd(int x){
    T[x].siz=T[lc(x)].siz+T[rc(x)].siz+1;
    T[x].rsiz=T[lc(x)].rsiz+T[rc(x)].rsiz+T[x].t;
}
int a[3000300],tp;
inline void dfs(int x){
    if(lc(x))dfs(lc(x));
    if(T[x].t)a[++tp]=x;
    if(rc(x))dfs(rc(x));
    lc(x)=rc(x)=0;
}
inline int bd(int l,int r,double L,double R){
    if(r<l)return 0;
    int mid=l+r>>1;
    T[a[mid]].L=L;
    T[a[mid]].R=R;
    double MID=(L+R)/2;
    lc(a[mid])=bd(l,mid-1,L,MID);
    rc(a[mid])=bd(mid+1,r,MID,R);
    T[a[mid]].w=MID;
    upd(a[mid]);
    return a[mid];
}
inline void rb(int &x){
	return ;
    if(1.l*max(T[lc(x)].siz,T[rc(x)].siz)/T[x].siz<alp)return ;
    tp=0;
    dfs(x);
    x=bd(1,tp,T[x].L,T[x].R);
}
inline void ins(int &x,int v,double L,double R){
    if(!x){
        x=v;
        T[x].L=L;
        T[x].R=R;
        T[x].w=(L+R)/2;
        return ;
    }
    double MID=(L+R)/2;
    T[x].w=MID;
    if(cmp(T[x],T[v]))ins(rc(x),v,MID,R);
    else ins(lc(x),v,L,MID);
    upd(x);
    rb(x);
}
inline void ins(int loc){
    int x=nnd(loc);
    mat[loc]=x;
    ins(rt,x,1,2e9);
}
inline void del(int x,double W){
    if(T[x].w>W)del(lc(x),W);
    else if(T[x].w<W)del(rc(x),W);
    else {T[x].rsiz--;T[x].t=0;return ;}
    upd(x);
}
inline void dell(int loc){
    del(rt,T[mat[loc]].w);
    mat[loc]=0;
}
inline int rk(int x,string s){
    if(!x){return 1;}
    if(cmp(T[x],s))return T[x].rsiz-T[rc(x)].rsiz+rk(rc(x),s);
    else return rk(lc(x),s);
}
inline int g(string s){
    s.push_back((char)('Z'+1));
    int r=rk(rt,s);
//    cout<<r<<" ";
    s.pop_back();
    s.back()--;
    s.push_back((char)('Z'+1));
    int l=rk(rt,s);
//    cout<<l<<endl;
    
    return r-l;
}
inline void ins(char x){
    A[--now]=x;
    ins(now);
}
inline void del(){
    dell(now);
    now++;
}
int q;
int lst;
inline string trs(string s){
    int w=lst;
    int k=s.size();
    for(int i=0;i<k;i++){
        w=(w*131+i)%k;
        swap(s[i],s[w]);
    }
    return s;
}
inline void ins(string s){
    for(char x:s)
        ins(x);
}
inline void del(int q){
    while(q--)del();
}
inline void slv(){
    cin>>q;
    string s;
    cin>>s;
    ins(s);
    while(q--){
        
        string op;
        cin>>op;
        if(op[0]=='A'){
            string s;
            cin>>s;
            s=trs(s);
            ins(s);
        }
        else if(op[0]=='Q'){
            string s;
            cin>>s;
            s=trs(s);
            reverse(s.begin(),s.end());
            int x=g(s);
            lst^=x;
            cout<<x<<endl;
        }
        else{
            int w;
            cin>>w;
            del(w);
        }
    }
    
}
inline void MT(){long long _;cin>>_;while(_--)slv();}
signed main(){ios::sync_with_stdio(0);
    // freopen(SS,"r",stdin);
//    MT();
    slv();
    return 0;
}
2024/1/18 09:37
加载中...