欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Z_trening - 204

最编程 2024-01-17 17:36:24
...

该题题意比较简单,有一个首尾相连的字符串,长度给定,从某个位置切断后,从两端开始取字符。规则为只能取颜色与首端珠子颜色相同的珠子,而首端珠子颜色如果是白色(w),就往下遍寻直至不是(w)的珠子作为第一个珠子的颜色。另外白色珠子可以被涂上任意颜色,因此如果遇到白色珠子是必定可以取出的。举例说明:wwwbbrwrbrbrrbrbrwrwwrbwrwrrb。我们把两个字符连在一起,得到新的字符串wwwbbrwrbrbrrbrbrwrwwrbwrwrrb wwwbbrwrbrbrrbrbrwrwwrbwrwrrb。连接字符串后,在1~n个字符中i位置开始切,最后切得的字符串为i~i+n,然后计算得到两端可取出的所有珠子总数。整体遍历一遍所有切点位置,维护更新最大珠子数即可。

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int main()
{
	int n, len = 0, maxn = 0;
	bool istaken[710];
	string s, ss;
	cin>>n; cin>>s;
	// 拼接字符串 
	ss = s; ss = ss+s;
	len = n;
	for(int i = 0; i < len; i++) {
		memset(istaken, false, sizeof(istaken));// 初始化珠子标示 
		int total = 0, ext = -1;
		// 从前往后取 
		ext = i;// 记录第一个颜色珠ss[ext]位置 
		while(ss[ext] == 'w')	ext++;		
		for(int j = i; j < i+len; j++) {
			if(ss[j] == ss[ext] || ss[j] == 'w') {
				total++;
				istaken[j] = true;
			} else {
				break;
			}
		}
		// 从后往前取 
		ext = i+len-1;
		while(ss[ext] == 'w')	ext--;
		for(int j = i+len-1; j >=i; j--) {
			if( (ss[j] == ss[ext] || ss[j] == 'w' ) && !istaken[j]) {
				total++;
				istaken[j] = true;
			} else {
				break;
			}
		}
		// 最大值 
		maxn = max(maxn, total);
	}
	cout<<maxn<<endl;
	return 0;
}