[POI2015]Trzy wieże
[POI2015]Trzy wieże
题目大意:
给定一个长度为\(n(n\le10^6)\)的仅包含'B'、'C'、'S'三种字符的字符串,请找到最长的一段连续子串,使得在这一段内出现过的所有字符中,字符的出现次数互不相同。
思路:
一个结论是对于子段\([l,r]\),当\(l\in[1,3]\)或\(r\in[n-2,n]\)时一定有解,而且一定能找到最优解。
证明略。
预处理\(1\sim n\)各数字出现次数前缀和,枚举\(l,r\)即可。
时间复杂度\(\mathcal O(n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
	register char ch;
	while(!isdigit(ch=getchar()));
	register int x=ch^'0';
	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
	return x;
}
inline int getval() {
	register char ch;
	while(!isalpha(ch=getchar()));
	if(ch=='B') return 0;
	if(ch=='C') return 1;
	return 2;
}
const int N=1e6+1;
int cnt[N][3];
inline bool check(const int &l,const int &r) {
	int tmp[3];
	for(register int i=0;i<3;i++) {
		tmp[i]=cnt[r][i]-cnt[l-1][i];
	}
	for(register int i=0;i<3;i++) {
		if(tmp[i]==0) continue;
		for(register int j=i+1;j<3;j++) {
			if(tmp[j]==0) continue;
			if(tmp[i]==tmp[j]) return false;
		}
	}
	return true;
}
int main() {
	const int n=getint();
	for(register int i=1;i<=n;i++) {
		for(register int j=0;j<3;j++) {
			cnt[i][j]+=cnt[i-1][j];
		}
		cnt[i][getval()]++;
	}
	int ans=0;
	for(register int i=1;i<=3;i++) {
		for(register int j=i;j<=n;j++) {
			if(check(i,j)) ans=std::max(ans,j-i+1);
		}
	}
	for(register int j=n-2;j<=n;j++) {
		for(register int i=1;i<=j;i++) {
			if(check(i,j)) ans=std::max(ans,j-i+1);
		}
	}
	printf("%d\n",ans);
	return 0;
}
[POI2015]Trzy wieże的更多相关文章
- BZOJ 4384: [POI2015]Trzy wieże
		4384: [POI2015]Trzy wieże Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 217 Solved: 61[Submit][St ... 
- 【BZOJ4384】[POI2015]Trzy wieże 树状数组
		[BZOJ4384][POI2015]Trzy wieże Description 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符 ... 
- BZOJ4384 : [POI2015]Trzy wieże
		首先只有一种字符的情况可以通过双指针在$O(n)$的时间内处理完毕. 设$cnt[i][j]$表示前$i$个字符中$j$字符出现的次数,那么对于两个位置$j<i$: 如果 $cnt[i][0]- ... 
- [Poi2015]
		[POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ... 
- POI2015题解
		POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ... 
- bzoj AC倒序
		Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ... 
- BZOJ 4385: [POI2015]Wilcze doły
		4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ... 
- Bzoj 3747: [POI2015]Kinoman  线段树
		3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ... 
- BZOJ 3747 POI2015 Kinoman 段树
		标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ... 
随机推荐
- 跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险
			跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险 跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估 ... 
- python的面对对象
			创建类 使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾: class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体 类的帮助信息 ... 
- CentOS6.6中安装telnet
			一.查看本机是否安装telnet rpm -qa | grep telnet 如果什么都不显示.说明你没有安装telnet 二.开始安装 yum install xinetd yum install ... 
- Framebuffer 驱动学习总结(二)---- Framebuffer模块初始化
			---恢复内容开始--- Framebuffer模块初始化过程:--driver\video\fbmem.c 1. 初始化Framebuffer: FrameBuffer驱动是以模块的形式注册到系统 ... 
- MySQL分布式集群之MyCAT(二)【转】
			在第一部分,有简单的介绍MyCAT的搭建和配置文件的基本情况,这一篇详细介绍schema的一些具体参数,以及实际作用 首先贴上自己测试用的schema文件,双引号之前的反斜杠不会消除,姑 ... 
- Django中HttpRequest和HttpResponse
			请求和响应对象 Django中通过使用请求和响应对象来传递系统的状态. 当请求一个页面的时候,Django就创建一个HttpRequest对象,它包含了关于请求的元数据对象,然后Django加载适当的 ... 
- MongoDB安全:创建第1个、第2个、第3个用户
			Windows 10家庭中文版,MongoDB3.6.3, 前言 使用mongod命令基于某个空白文件夹(存放数据)启动MongoDB服务器时,要是没有使用--auth选项,启动后,任何客户端是可以无 ... 
- python logging 日志
			logging与print 区别,为什么需要logging? 在写脚本的过程中,为了调试程序,我们往往会写很多print打印输出以便用于验证,验证正确后往往会注释掉,一旦验证的地方比较多,再一一注释比 ... 
- java jps命令使用解析
			在linux环境下显示一个进程的信息大家可能一直都在使用ps命令,比如用以下命令来显示当前系统执行的java进程: ps -ef | grep java 针对java的进程,jdk1.5以后提供了一个 ... 
- who am i ?
			Id:Ox9A82 Email:hucvbty@gmail.com 微博:http://weibo.com/1828621423 知乎:Ox9A82 常乐村男子职业技术学院 Syclover拖后腿成员 ... 
