Problem - C - Codeforces
这道题目要求你从一个由'b'和'w'组成的字符串中选择连续的、交替出现的颜色块来拼出斑马纹路,然后对这个字符串进行零次或多次的切分、翻转和粘合操作,以达到最大的斑马长度。
具体来说,Grisha想要选择若干连续的、交替出现的颜色块来组成一条斑马纹路,其中选中的颜色块数称为该斑马纹路的长度。在组装斑马之前,Grisha可以进行多次如下操作:将字符串在某个位置切成两部分,然后分别翻转这两部分并重新粘合起来。例如,如果Grisha有一些按序列排列的颜色块“bwbbw”(这里'b'表示黑色条纹,'w'表示白色条纹),那么他可以将序列分割成"bw|bbw"的形式(这里竖线表示切割的位置),然后翻转每个部分并粘合起来得到"wbwbb"。
你要确定Grisha可以制作出的最长斑马纹路的长度。
输入为只有一行,包含一个由小写英文字母'b'和'w'组成的字符串s(1≤|s|≤105,其中|s|表示字符串s的长度)。
输出一个整数,表示Grisha能够制作的最长斑马纹路的长度。
Examples
Input
Copy
bwwwbwwbw
Output
Copy
5
Input
Copy
bwwbwwb
Output
Copy
3
第一个例子中,可能的操作序列之一是 bwwwbww|bw → w|wbwwwbwb → wbwbwwwbw,这会得到答案为5。
在第二个例子中,没有任何操作能够增加答案。
题解:
完全没有思路的一题
假设wb|wbb 反转为bwbbw
我们wb放在wbb后面 wbbwb只是与我们操作结果顺序相反
我们可以把这个串看成一个环,无论怎么操作,相对位置不会改变,那么我们只需要统计环内连续不同的最长串即可
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 3e5 + 10;
int mod = 1e9 + 7;
void solve()
{
string s;
cin >> s;
int n = s.size();
s = s + s;
int len = 1,ans = 1;
for(int i = 1;i < 2*n;i++)
{
if(s[i] != s[i - 1])
{
len++;
ans = max(ans,len);
}
else
{
ans = max(ans,len);
len = 1;
}
}
ans = min(ans,n);
cout << ans;
}
signed main()
{
ios::sync_with_stdio(0 );
cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
while(t--)
{
solve();
}
}