loj2291. 「THUSC 2016」補退選
阿新 • • 發佈:2017-12-27
post arp loj begin brush switch return -- thusc
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」補退選