https://loj.ac/problem/2291
在Tire树套vector上乱搞一波
如何二分查找时间
#include<cstdio>
#include<vector>
#include<algorithm>
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
#define pb push_back
using namespace std;
inline int fabs(int a){return a>0?a:-a;}
int n,k,g;
int a,b,c,v,ans;
const int N=6333333;
int tr[N][10],sz=1,root,cnt[N];
vector<int>s[N],t[N];
inline int gch(int x,int c){
register int &r=tr[x][c];
if(!r)r=++sz,s[sz].pb(0),t[sz].pb(0);
return r;
}
char S[233];
int main(){
scanf("%d",&n);
s[1].pb(0);t[1].pb(0);
FOR(i,1,n){
scanf("%d%s",&k,S);
g=1;
switch(k){
case 1:{
for(register int j=0;S[j];++j){
++cnt[g=gch(g,S[j]-'a')];
if(cnt[g]>s[g].back())t[g].pb(i),s[g].pb(cnt[g]);
}
break;
}
case 2:{
for(register int j=0;S[j];--cnt[g=gch(g,S[j]-'a')],++j);
break;
}
case 3:{
scanf("%d%d%d",&a,&b,&c);
v=1ll*(1ll*a*fabs(ans)%c+b%c)%c;
for(register int j=0;S[j];++j)
g=tr[g][S[j]-'a'];
if(!g){
ans=-1;
printf("%d\n",ans);
goto die;
}
else{
register vector<int>::iterator it=upper_bound(s[g].begin(),s[g].end(),v);
if(it==s[g].end()){
ans=-1;
printf("%d\n",ans);
goto die;
}
ans=t[g][it-s[g].begin()];
printf("%d\n",ans);
}
break;
}
}
die:;
}
return 0;
}