Codeforces 604 C Alternative Thinking【思维】

C. Alternative Thinking

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard 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

Output

5

Input

2
01

Output

2

Note

In the first sample, Kevin can flip the bolded substring '10000011' and turn his string into '10011011', which has an alternating subsequence of length 5: '10011011'.

In the second sample, Kevin can flip the entire string and still have the same score.

 

题目大意:

给你一个长度为n的01串,我们可以进行一次区间翻转(起点终点自己定),得到一个新的01串,使得得到的新的01串中的一个子串最长,且这个子串是01间隔的。

e.g:

1010 4

1011 3

1101101 5


思路:


1、通过枚举发现,在原串中如果有一段长度大于3的连续相等子串:10000000001-------------->10100000001,那么其解ans=原串最长子串长度+2.


2、再通过枚举发现,在原串中有一段长度为2的连续相等的子串:110101---------->010101,那么其解ans=原串最长子串长度+1.


以上两种方案都是通过改变原串某一个字符增加长度的,接下来我们再枚举一下通过区间翻转的情况带来增加的情况:


3、再通过枚举发现,在原串中假如有两段以及两段以上的长度为2的连续相等子串:1100---------------->1010,那么其解ans=原串最长子串长度+2.


4、思路构建完毕,剩下的工作就是敲代码、


Ac代码:


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[1000000];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int output=1;
        scanf("%s",a);
        int maxn=0;
        int contz=1;
        int cont2=0;
        for(int i=0;i<n-1;i++)
        {
            if(a[i]==a[i+1])
            {
                contz++;
            }
            else
            {
                if(contz==2)cont2++;
                contz=1,output++;
            }
            maxn=max(contz,maxn);
        }
        if(contz==2)cont2++;
        if(maxn>=3)output+=2;
        if(maxn==2&&cont2>1)output+=2;
        if(maxn==2&&cont2==1)output+=1;
        printf("%d\n",output);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值