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>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
#define mod 10003
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 1<<30;
const int maxn = 1000003;
const double eps = 1e-8;
int t,n,m,q;
int sum[maxn];
int p[maxn],l,r,x,y;
char s[maxn];
LL min(LL x,LL y){return x>y?y:x;}
LL max(LL x,LL y){return x>y?x:y;}

int main()
{
    while(~scanf("%s",s+1))
    {
        LL ans=0,cnt=0;
        int n=strlen(s+1);
        for(int i=1;i<=n;i++)
        {
            s[i+n]=s[i];
        }
        for(int i=1;i<=2*n;i++)
        {
            if(s[i]!=s[i-1])
                ans=max(ans,++cnt);
            else cnt=1;
        }
        cout<<min(ans,n)<<endl;
    }
    return 0;
}
/*
设原串为s1,s2,...sn,我们将原串拉长一倍得到:S=s1,..sn...s2n
很显然的一个事实:无论将原串如何合法处理,得到的新串始终是S的一个子串。

所以我们此时只需要从头到尾去扫一遍统计前后相等与不相等的最长长度即可。
*/

原文地址:https://www.cnblogs.com/Roni-i/p/9527578.html

时间: 2024-11-09 03:53:19

CF1025C Plasticine zebra【环状字符串/思维】的相关文章

Codeforces 1025C Plasticine zebra(思维)

题目链接:CF 1025C 题意:给定一个只有b和w的字符串,可以选定任意位置,得到两个字符串(可以是空串)并进行翻转,操作可以进行任意次,求连续的不同字符的最大长度. 题解:考虑翻转的意义,无非就是拼成一个环,可以从任意地方截取,我们可以得到把原字符串扩增一倍,在得到的新的字符串中寻找连续的不同字符的最大长度即答案.注意超过n选取n. 1 #include <set> 2 #include <map> 3 #include <queue> 4 #include <

codeforce 1025C - Plasticine zebra (模拟)

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

Codeforces Round #541 (Div. 2) E 字符串 + 思维 + 猜性质

https://codeforces.com/contest/1131/problem/D 题意 给你n个字符串,字符串长度总和加起来不会超过1e5,定义字符串相乘为\(s*s1=s1+s[0]+s1+s[1]+s1+...+s1+s[size-1]+s1+s[size]+s1\),求n个字符串依次相乘后最长连续字符相同的子序列长度 题解 鬼畜的题意 or 难以优化的复杂度,都需要观察性质才能做,第二串要插入第一个串每个字符之间,可以看出字符数增长的速度很快,所以并不能把整个字符存下来 只看一种

HDU5414——字符串思维题——CRB and String

http://acm.hdu.edu.cn/showproblem.php?pid=5414 /************************************************ * Author :Powatr * Created Time :2015-8-21 10:45:46 * File Name :1009.cpp ************************************************/ #include <cstdio> #include &

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++

UVA 1584 - Circular Sequence(环状序列)(字典序)

1584 - Circular Sequence Time limit: 3.000 seconds Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequence ``CGAGTCAGCT", that is, the last symbol ``T" in ``CGAGTCAGCT" is connected to the firs

UVA 1584 环状序列

题意: 给定一个环状字符串,输出字典序最小的线装字符串. 分析: 我一开始是将原字符串*2去模拟环,然后分别截取以字符串不同字母为首的子串,然后用sort去排序输出最小的串,复杂度为O(n^2 + nlogn)吧. 然后看了紫书的题解,用了一个函数去枚举比较每一个字母为开头的子串和预估答案的子串的字符串字典序大小,枚举串的某一个字母的使整个串字符串小于另一个串(他们长度都是一样的,只要其中一个小,那么整个就会小,因为字典序是取决前面的字母的)就立刻更新ans,然后他用的是下标mod长度,最坏复杂

ACM训练大纲

1. 算法总结及推荐题目 1.1 C++ STL ? STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset? STL算法: sort, unique, nth_element, reverse, rotate, next_permution, find, for_each, count, lower_bound, max, swap, random_shuffle 1.2 基本算法 ? 枚举: poj1753,

Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) -B C(GCD,最长连续交替序列)

B. Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output During the research on properties of the greatest common divisor (GCD) of a set of numbers, Ildar, a famous mat