Codeforces 1025C Plasticine zebra(思维)

题目链接:CF 1025C

题意:给定一个只有b和w的字符串,可以选定任意位置,得到两个字符串(可以是空串)并进行翻转,操作可以进行任意次,求连续的不同字符的最大长度。

题解:考虑翻转的意义,无非就是拼成一个环,可以从任意地方截取,我们可以得到把原字符串扩增一倍,在得到的新的字符串中寻找连续的不同字符的最大长度即答案。注意超过n选取n。

 1 #include <set>
 2 #include <map>
 3 #include <queue>
 4 #include <deque>
 5 #include <stack>
 6 #include <cmath>
 7 #include <cstdio>
 8 #include <vector>
 9 #include <string>
10 #include <cstring>
11 #include <fstream>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15
16 #define eps 1e-8
17 #define PI acos(-1.0)
18 #define INF 0x3f3f3f3f
19 #define FAST_IO ios::sync_with_stdio(false)
20
21 const int N=2e5+10;
22 typedef long long LL;
23 char s[N];
24
25 int main(){
26     scanf("%s",s);
27     int n=strlen(s);
28     for(int i=0;i<n;i++) s[i+n]=s[i];
29     int ans1=1,ans2=1,id=-1;
30     if(s[0]==‘w‘) id=-1;
31     else id=1;
32     for(int i=1;i<2*n;i++){
33         if(s[i]==‘w‘){
34             if(id==1) ans1++,id=-1;
35             else{
36                 if(s[i]==‘b‘) ans1++,id=-1;
37                 else{
38                     ans1=1;
39                 }
40             }
41             ans2=max(ans1,ans2);
42         }
43         else{
44             if(id==-1) ans1++,id=1;
45             else{
46                 if(s[i]==‘w‘) ans1++,id=1;
47                 else{
48                     ans1=1;
49                 }
50             }
51             ans2=max(ans1,ans2);
52         }
53     }
54     if(ans2>n) ans2=n;
55     printf("%d\n",ans2);
56     return 0;
57 }

原文地址:https://www.cnblogs.com/ehanla/p/9520877.html

时间: 2024-11-09 03:35:26

Codeforces 1025C Plasticine zebra(思维)的相关文章

codeforce 1025C - Plasticine zebra (模拟)

有一个由'w'和'b'组成字符串,你可以把这个字符串分成两个部分,然后分别翻转,次数不限(比如bw|bbw ('|'代表分割线), 翻转之后变成 "wbwbb".).问你连续的'w' 'b' 交替出现的最长长度是多少. 我们观察这个操作的特点,发现其实就像相当于把这个串的首尾相连,然后在分隔处截断.也就是说,如果我们把这个字符串看成首尾相连的一个环,那么,不管怎么操作,这些字母的相对位置都是不会改变的,也就是说,我们直接统计这个环里面的最长交替出现的长度即可. 至于怎么把它看成一个环,

CF1025C Plasticine zebra【环状字符串/思维】

给你一个长度为 \(\left|s\right|\) 的01串 \(s\) ,每次操作你可以任选一个 \(k\) ,使01串的 \([1,k]\) 和 \((k,\left|s\right|]\) 分别翻转(其中一个区间可以为空),求经过任意次操作后能得到的最长的01交替出现的子串的长度.(实际题目中01用w和b代替) #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #i

codeforces cf round#505(based on vk cup 2018 final) C. Plasticine zebra

构造题,把整个串想象成一个环.每次把环断开并反转的时候从切口处看进去的顺序是和刚开始从头到尾的顺序是一样的.于是每次不管如何翻转最后都要找到这个环上最大的连续子段长度 #include<bits/stdc++.h> using namespace std; string s; int main() { cin>>s; int tmp=s.size(); s=s+s; int ans=0; int len=1; for(int i=0;i<(int)s.size()-1;i++

CodeForces 1102C-简单的思维题

题目链接:http://codeforces.com/problemset/problem/1102/C C. Doors Breaking and Repairing time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are policeman and you are playing a game with Slavik

CodeForces 789D 欧拉路径计数,思维

CodeForces 789D 题意:n个点m条边的无向图,求经过其中m-2条边两次,剩下2条边一次的方案数有几种,如果剩下两条边的集合一样算同一种. tags: 选出两条边,其它m-2条边假想复制成两条,这样就是要求欧拉路径是否存在,即奇点个数是否为0或2. 所以该怎么选这两条边呢? 先把边分为自环边和普通边. 1.选取两条不相邻普通边,图中存在4个奇点,不满足欧拉路径条件: 2.选取两条相邻普通边,图中存在2个奇点,满足欧拉路径条件: 3.选取一条普通边一条自环,图中存在2个奇点,满足欧拉路

CodeForces 789E bfs建模,思维

CodeForces 789E 题意:有k种可乐,每种的测试为ai/1000. 要你合成一种浓度为n/1000的可乐,问最小要杯可乐,每种可乐可重复取. tags:  要注意到浓度绝不会超过1000/1000. 假设选取m杯可乐,则 (a1+a2+......+am) / m = n,变换一下为(a1-n)+(a2-n)+......+(am-n) = 0.即要选 m杯可乐,其浓度减 n之和为0.而浓度不超过1000,故(a1-n)+(a2-n)+....+(as-n)的和肯定在 -1000~1

2017-03-16 Codeforces 453A 概率期望,思维 UOJ 228(待补)

Codeforces 453A   A. Little Pony and Expected Maximum 题意:一个m面质地均匀的骰子,每面出现的概率都是独立的1/m, 你需要投掷n次,其结果是这n次出现的最大点数.问投掷n次骰子的结果的期望值是多少,要求相对误差或绝对误差不超过1e-4. tags:枚举骰子出现最大值i,计算出最大值为i时的概率,就得到了答案. 最大值为i的概率=(i/m)^n-((i-1)/m)^n. #include<bits/stdc++.h> using names

Codeforces Round #399 B 思维 C 模拟 D 概率dp E SG博弈

Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined)B. Code For 1 题意:数n,不断拆分为 n/2, n&1, n/2,直到都为0或1.求区间[l, r]有多少个1. tags:画一画很容易看出来,类似dfs中序遍历. //#399 B #include<bits/stdc++.h> using namespace std; #pragma comment(linker, &quo

Codeforces 864 C Bus 思维

题目链接: http://codeforces.com/problemset/problem/864/C 题目描述: 输入a, b, f, k , 一段长度为a的路来回走, 中间f的地方有一个加油站, 油罐的容量为b, 问想要走b次这条路至少需要加多少次油 解题思路: 由于K <= 1e4, 所以将每次需要走路的连续序列构造出来再去遍历一遍这个序列看啥时候需要加油就可以了 代码: #include <iostream> #include <cstdio> #include &