【33.10%】【codeforces 604C】Alternative Thinking
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Kevin has just recevied his disappointing results on the USA Identification of Cows Olympiad (USAICO) in the form of a binary string of length n. Each character of Kevin’s string represents Kevin’s score on one of the n questions of the olympiad—’1’ for a correctly identified cow and ‘0’ otherwise.
However, all is not lost. Kevin is a big proponent of alternative thinking and believes that his score, instead of being the sum of his points, should be the length of the longest alternating subsequence of his string. Here, we define an alternating subsequence of a string as a not-necessarily contiguous subsequence where no two consecutive elements are equal. For example, {0, 1, 0, 1}, {1, 0, 1}, and {1, 0, 1, 0} are alternating sequences, while {1, 0, 0} and {0, 1, 0, 1, 1} are not.
Kevin, being the sneaky little puffball that he is, is willing to hack into the USAICO databases to improve his score. In order to be subtle, he decides that he will flip exactly one substring—that is, take a contiguous non-empty substring of his score and change all ‘0’s in that substring to ‘1’s and vice versa. After such an operation, Kevin wants to know the length of the longest possible alternating subsequence that his string could have.
Input
The first line contains the number of questions on the olympiad n (1 ≤ n ≤ 100 000).
The following line contains a binary string of length n representing Kevin’s results on the USAICO.
Output
Output a single integer, the length of the longest possible alternating subsequence that Kevin can create in his string after flipping a single substring.
Examples
input
8
10000011
【题目链接】:http://codeforces.com/contest/604/problem/C
【题解】
先把连续的0串和1串压缩成一位.
这样整个字符串就是符合要求的01间隔出现的串了.记录每一位压缩了几个。
这个串的长度就是初始的间隔01串的长度.
接下来.
考虑以下几种情况.
1.
某一位压缩的个数>=3;
则可以在中间位置进行取反操作(一个数就可以);
这样就把01串的长度增加了2;(而2是一次操作能够增加的最多位数);
所以直接输出就可以了.
2.有连续两位,这两位的压缩位数分别都是2;
即
1100这样的情况
可以变成1010
也是增加2;
所以这种情况也直接输出答案.
3.有两位,这两位压缩数都是2,且它们中间间隔的位,压缩位数都是1。
即
1101011
这种情况2..len-1取反
1010101
可以发现也能增加2;
所以也可以直接输出
4.有一位它的压缩位数为2.则答案增加1
5.全都是1位。答案和原来一样(不会减少的,可以全都取反啊。。这个时候全是1为了哦);
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int MAXN = 1e5+100;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
char s[MAXN];
vector <pii> a;
int n;
int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);
scanf("%s",s+1);
int i = 1;
bool judge1 = false,judge2 = false;
while (i <= n)
{
int j = i+1;
while (j <=n && s[j] == s[i]) j++;
a.pb(mp(s[i]-'0',j-i));
if (j-i>=3)
judge1 = true;
i = j;
}
int ans1 = a.size();
if (judge1)
{
cout << ans1+2 << endl;
return 0;
}
rep1(i,0,ans1-1)
{
if (i+1<=ans1-1)
{
int ma = max(a[i].se,a[i+1].se),mi = min(a[i].se,a[i+1].se);
if (ma ==2 && mi ==2)
{
cout << ans1+2<<endl;
return 0;
}
else
if (ma==2)
judge2 = true;
}
}
if (ans1==1 && a[0].se==2)
judge2 = true;
rep1(i,0,ans1-1)
if (a[i].se==2 && i+1<=ans1-1)
{
int j = i+1;
while (j <= ans1-1 && a[j].se==1) j++;
if (a[j].se == 2)
{
cout << ans1+2<<endl;
return 0;
}
else
judge2 = true;
}
if (judge2)
cout << ans1+1<<endl;
else
cout << ans1<<endl;
return 0;
}
【33.10%】【codeforces 604C】Alternative Thinking的更多相关文章
- Java Web程序设计笔记 • 【第10章 JSTL标签库】
全部章节 >>>> 本章目录 10.1 JSTL 概述 10.1.1 JSTL 简介 10.1.1 JSTL 使用 10.1.2 实践练习 10.2 核心标签库 10.2. ...
- 【2017.10.13 ROS机器人操作系统】ROS系统常用术语及资源
ROS机器人操作系统是一种后操作系统,提供了类似于软件开发中使用到的中间件的功能. ROS: Robot Operating System 机器人操作系统 Package: 功能包 Stack: 功能 ...
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【23.33%】【codeforces 557B】Pasha and Tea
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【33.33%】【codeforces 552B】Vanya and Books
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【33.33%】【codeforces 586D】Phillip and Trains
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【33.33%】【codeforces 608C】Chain Reaction
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【25.33%】【codeforces 552D】Vanya and Triangles
time limit per test4 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- 【58.33%】【codeforces 747B】Mammoth's Genome Decoding
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
随机推荐
- android图像处理系列之六--给图片添加边框(下)-图片叠加
前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...
- Impala的安装(含使用CM安装 和 手动安装)(图文详解)
Impala有两种安装方式: 1)使用CM安装Impala 2)手动安装Impala 注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 6.5系统中安装. 基 ...
- android组件
SlidingDrawer http://www.cnblogs.com/renyuan/archive/2012/09/16/2687929.html autocompletetextview / ...
- Vue 打包后报错 Uncaught TypeError: Cannot redefine property: $router
原因:就如报错提示所描述的,不能重新定义$router,说明是重复定了$router.通常是因为在项目中安装了vue-router的依赖并且用Vue.use()使用了vue-router,还在inde ...
- ODBC总结
引用头文件:sql.h.sqlext.h.sqltypes.h 添加库文件:odbc32.lib odbccp32.lib 1.定义环境变量: SQLHENV henv =nullptr://环境 ...
- 【2017"百度之星"程序设计大赛 - 初赛(A)】今夕何夕
[链接]http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=775&pid=1005 [题意] 在这里写题意 [题 ...
- Hi35xx NVR GDB调试
Hi35xx NVR GDB调试 1. 下载gdb源代码 嵌入式Linux 的GDB 调试环境由Host 和Target 两部分组成,Host 端使用arm-linuxgdb,Target Boa ...
- Jquery获取select选中的option的文本信息
注意:以下用的$(this)代表当前选中的select框 第一种: $(this).children("option:selec... ...查看全文
- C Tricks(十八)—— 整数绝对值的实现
为正还是为负:(对 int 类型而言,第一位为符号位,其余为数值,则右移 31 位,再与 1 求与) 如果为正 ⇒ 返回原值 如果为负 ⇒ 对其二进制形式各位取反 + 1 int abs(int x) ...
- html只能有一个id,并且id的值只能是一个
1.如果有相同的ID,javascript只会取第一个具有该ID的标签. 2.如果id值有两个,JS只会取到第一个,并不会像class类一样,类名并列就可以同时取到.