loj2291. 「THUSC 2016」补退选

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
",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
",ans);
						goto die; 
					}
					ans=t[g][it-s[g].begin()];
					printf("%d
",ans);
				}
				break;
			}
		}
		die:;
	}
	return 0;
} 

  

原文地址:https://www.cnblogs.com/Stump/p/8125888.html