[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的更多相关文章

  1. BZOJ 4384: [POI2015]Trzy wieże

    4384: [POI2015]Trzy wieże Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 217  Solved: 61[Submit][St ...

  2. 【BZOJ4384】[POI2015]Trzy wieże 树状数组

    [BZOJ4384][POI2015]Trzy wieże Description 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符 ...

  3. BZOJ4384 : [POI2015]Trzy wieże

    首先只有一种字符的情况可以通过双指针在$O(n)$的时间内处理完毕. 设$cnt[i][j]$表示前$i$个字符中$j$字符出现的次数,那么对于两个位置$j<i$: 如果 $cnt[i][0]- ...

  4. [Poi2015]

    [POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ...

  5. POI2015题解

    POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. BZOJ 4385: [POI2015]Wilcze doły

    4385: [POI2015]Wilcze doły Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 648  Solved: 263[Submit][ ...

  8. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

  9. BZOJ 3747 POI2015 Kinoman 段树

    标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...

随机推荐

  1. Dream------scala--scala内部类实战

    Dream------scala--scala内部类实战 scala的内部类跟java的内部类有很大的不同,java中的内部类实际上是从属于外部类,而scala的内部类是从属于外部类对象的(及外部类实 ...

  2. lucene总结——(十七)

    (01)rownum和rowid有何区别?      rownum在表结构中是看不见的,只能在select中明确写出rownum方可显示      rownum与不同的表绑定在一起,每张表都有自已的r ...

  3. 【FCS NOI2018】福建省冬摸鱼笔记 day6【FJOI 2018】福建省选混分滚蛋记 day1

    记录一下day6发生的事情吧. 7:30 到达附中求索碑,被人膜,掉RP. 7:50 进考场,6楼的最后一排的最左边的位置,世界上最角落的地方,没有任何想法. 发现电脑时间和别人不一样,赶快调了一下. ...

  4. torch.nn.CrossEntropyLoss

    class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100, reduce=True) 我这里没 ...

  5. Centos7安装 mysql5.6.29 shell脚本

    有很多可以借鉴的地方,故转载: 创建脚本mysql.sh,直接运行sh mysql.sh !/bin/bash if [ -d /software ] ;then cd /software else ...

  6. .NET 4.5 Task异步编程学习资料

    参考资料: 1. http://www.cnblogs.com/heyuquan/archive/2013/04/18/3028044.html

  7. Python 文件IO

    Python 文件I/O 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下: #!/u ...

  8. jersey 过滤器名称绑定的问题 NameBinding Provider

    查资料也不容易查,这个问题困扰了我两天. 当没有 @Provider 的时候 过滤器不会被执行.

  9. Extjs 代码拾穗

    1.tree grid 添加一行 var rootNode = store.getRootNode(); var newRecord = Ext.create('MatrixDlv',{"s ...

  10. 在SQL中有时候我们需要查看现在正在SQL Server执行的命令

    在SQL中有时候我们需要查看现在正在SQL Server执行的命令.在分析管理器或者Microsoft SQL Server Management Studio中,我们可以在"管理-SQL  ...