BZOJ4896 [Thu Summer Camp2016]补退选

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:BZOJ4896

正解:$Trie+vector$

解题报告:

  $THUSC2016$ $T2$

  考虑每次加入删除对出现次数的影响只会加减一,那么我可以先用$Trie$来维护整个问题中出现的字符串,然后对于每个节点我都记录一下以当前串为前缀的字符串个数,同时开个$vector$维护出现次数为$x$时的最早时刻。

  因为每次修改只会加减一,那么空间与字符串长度同级,这个用$vector$实现很方便。

//It is made by ljh2000
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <queue>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long LL;
const int MAXN = 100011;
int n,ch[MAXN*60][10],c[MAXN*60],len,S,cnt,ans;
char s[MAXN];
vector<int>w[MAXN*60];

inline int getint(){
    int w=0,q=0; char c=getchar(); while((c<‘0‘||c>‘9‘) && c!=‘-‘) c=getchar();
    if(c==‘-‘) q=1,c=getchar(); while (c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar(); return q?-w:w;
}

inline void work(){
	n=getint(); S=cnt=1; int type,u,now; LL x,A,B,C;
	for(int o=1;o<=n;o++) {
		type=getint(); u=S;
		scanf("%s",s); len=strlen(s);
		if(type==1) {
			for(int i=0;i<len;i++) {
				now=s[i]-‘a‘; if(!ch[u][now]) ch[u][now]=++cnt;
				u=ch[u][now]; c[u]++;
				if(c[u]>(int)w[u].size()) w[u].push_back(o);
			}
		}
		else if(type==2) {
			for(int i=0;i<len;i++) {
				now=s[i]-‘a‘;
				u=ch[u][now]; c[u]--;
			}
		}
		else {
			u=S; scanf("%lld%lld%lld",&A,&B,&C);
			ans=abs(ans);//!!!
			x=1LL*ans*A%C; x+=B; x%=C;
			ans=0;
			for(int i=0;i<len;i++) {
				now=s[i]-‘a‘;
				if(!ch[u][now]) { ans=-1; break; }
				u=ch[u][now];
			}
			if(ans!=-1) {
				if((int)w[u].size()<=x) ans=-1;
				else ans=w[u][x];
			}
			printf("%d\n",ans);
		}
	}
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("selection.in","r",stdin);
	freopen("selection.out","w",stdout);
#endif
    work();
    return 0;
}
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  

 

时间: 2024-08-09 13:28:03

BZOJ4896 [Thu Summer Camp2016]补退选的相关文章

【BZOJ4896】[Thu Summer Camp2016]补退选 Trie树

[BZOJ4896][Thu Summer Camp2016]补退选 Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最忙碌.在补退选阶段,学生即可以选课,也 可以退课.对于X老师来说,在补退选阶段可能发生以下两种事件: 1:一个姓名为S的学生选了他的课(姓名S将出现在X的已选课学生名单中) 2:一个姓名为S的学生退了他的课(姓名S将从X的已

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

4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 315  Solved: 97[Submit][Status][Discuss] Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最忙碌.在补退选阶段,学生即可以选课,也 可以退课.对于

bzoj4896 补退选

Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最忙碌.在补退选阶段,学生即可以选课,也 可以退课.对于X老师来说,在补退选阶段可能发生以下两种事件: 1:一个姓名为S的学生选了他的课(姓名S将出现在X的已选课学生名单中) 2:一个姓名为S的学生退了他的课(姓名S将从X的已选课学生名单中移除) 同时,X老师对于有哪些学生选了他的课非常关心,所

【bzoj4897】[Thu Summer Camp2016成绩单]

[bzoj4897][Thu Summer Camp2016成绩单] 区间DP神题 Orz GXZ 看了GXZ大神的博客然后懂了. 考虑如何把最大最小值压进状态里. 设\(f[l][r]\)表示\(l\)到\(j\)删除的最小代价. \(g[l][r][i][j]\)表示序列\(l\)到\(r\)删至最大值为\(i\),最小值为\(j\)的最小代价 然后考虑转移\(g\) 考虑最后一位r. 转移有两种情况: 第一种:它在\([l,r]\)中被整体删除.那么这个时候就要更新最大最小值 \(g[l]

【bzoj4896】补退选

傻逼题. 每个点维护下vector,然后随便做. #include<bits/stdc++.h> const int N=300000; using namespace std; typedef long long ll; struct Node{ int ch[20],size; vector<int> c; }t[N]; int n,cnt,ans,len;char s[200]; inline int read(){ int f=1,x=0;char ch; do{ch=ge

[THUSC2016]补退选 - Trie

Description 维护一个字符串集合,有三种事件,加入一个字符串,删除一个字符串,询问最早在哪个事件之后,以某个串为前缀的字符串数量超过\(k\),强制在线.\(n \le 100000,|S| \le 60\),输入中的所有字符串只会包含前\(10\)个小写字母. Solution 建立\(Trie\)树维护字符串集合,在\(Trie\)树上的每一个节点开一个\(vector\),用来记录子树内的结束节点到达某个值的最早时刻,查询时直接找到前缀对应节点即可. Code #include

THUSC2016 游记

浑浑噩噩地就出发了,只记得可以翘课,不知道自己要干什么去. Day 0    5点起床,到潮汕机场坐飞机.第一次坐飞机非常不爽起飞和降落时的加速度……终于还是转转地铁.动车在下午4点左右抵达目的地,西郊宾馆.按事先的安排和Ccz住双人房.北京的红绿灯好奇怪啊,红灯刚过,绿灯就开始闪,闪了很久也没变化……晚上KPM出去浪,Czl来我们房间玩,于是我们在他电脑上玩去<疯狂小人战斗>,考前回归一发童年.(3P 3个键盘真爽) Day 1    6点醒,吃了顿挺不错的早餐,就坐车去THU了,200号人

# 清北冬令营真题泛做

清北冬令营真题泛做 前言 这段时间为了准备冬令营把清北冬令营真题都做了一下.更个博回顾一下(免得你们老说我咕咕咕). 先写良心PKU的题再写THU的题, 主要是THU的题和PKU比起来真的毒瘤好多...... PKUWC2018 [PKUWC2018]Minimax 一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可. 为啥不用线段树合并代替归并排序呢? 暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个\(log\). [PKUWC2018]Slay the Sp

软件概要设计文档(终)

软件概要设计文档 1.引言 1.1目的 该文档的目的是描述辅助选课系统的概要设计,主要内容包括系统功能简介.系统结构设计.系统结构设计.系统接口设计.模块设计和界面设计等. 本文档预期的读者包括设计人员.开发人员.项目管理人员.测试人员. 1.2范围 1.2.1系统目标 开发一个支持学生选课并辅助学生选课的APP. 1.2.2主要软件需求 该系统主要功能包括: l  用户登录 l  用户选课 l  查看课表 l  辅助选课 l  信息更新 1.2.3软件设计约束 软件支持单键盘.单鼠标的物理结构