loj2291. 「THUSC 2016」补退选

Posted Stump

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\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;
} 

  

以上是关于loj2291. 「THUSC 2016」补退选的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ4896 [Thu Summer Camp2016]补退选

bzoj4896 [Thu Summer Camp2016]补退选

BZOJ4896[Thu Summer Camp2016]补退选 Trie树

bzoj4896 [Thu Summer Camp2016]补退选

BZOJ 4896 :[Thu Summer Camp2016]补退选 Trie树+Vector

bzoj4896 补退选