题意:翻转连续字串,使得‘10101....'子串最长。
思路:乍一看是dp,其实不用。翻的子串的不相邻长度是不变的。因此只需找'11'和'00'就可以了。由于只有字串边界有影响,因此最多增长2,且不会比原串小。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <list>
#include <queue>
#include <map>
#include <stack>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 1000010
#define MOD 1000000007
char s[maxn];
int n;
int main()
{
int t;
//scanf("%d",&t);
while(scanf("%d",&n) != EOF)
{
scanf("%s",s);
int ans = 1;
for(int i = 0; i < n-1; i++)
if(s[i] != s[i+1])
ans++;
printf("%d\n",min(ans+2,n));
}
}