1. 程式人生 > >[Thu Summer Camp2016]補退選

[Thu Summer Camp2016]補退選

題目描述不說了。

題解:

Trie+vector……

Trie存學生,vector存答案。

極為無腦但無腦到讓人懷疑

程式碼:

#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100050
#define M 6000050
int n,ans=0;
char s[65];
struct Trie
{
    int tot,siz[M],ch[M][12
]; vector<int>v[M]; void insert(int k) { int len = strlen(s+1),u=0; for(int i=1;i<=len;i++) { siz[u]++; if(v[u].size()<siz[u])v[u].push_back(k); int c = s[i]-'a'+1; if(!ch[u][c])ch[u][c]=++tot; u
=ch[u][c]; } siz[u]++; if(v[u].size()<siz[u])v[u].push_back(k); } void erase() { int len = strlen(s+1),u=0; for(int i=1;i<=len;i++) { siz[u]--; int c = s[i]-'a'+1; u=ch[u][c]; } siz[u]
--; } int query(int k) { int len = strlen(s+1),u=0; for(int i=1;i<=len;i++) { int c = s[i]-'a'+1; u=ch[u][c]; } if(v[u].size()<=k)return -1; return v[u][k]; } }tr; int main() { scanf("%d",&n); for(int opt,a,b,c,i=1;i<=n;i++) { scanf("%d",&opt); if(opt==1) { scanf("%s",s+1); tr.insert(i); } if(opt==2) { scanf("%s",s+1); tr.erase(); } if(opt==3) { scanf("%s%d%d%d",s+1,&a,&b,&c); int tmp =(int)((1ll*a*abs(ans)+b)%c); printf("%d\n",ans=tr.query(tmp)); } } return 0; }