Z_trening - 204

本文介绍了一种串珠游戏的算法实现,通过首尾相连的字符串处理,寻找从任一位置切割后能获取的最大相同颜色珠子数量。文章详细解释了如何通过双指针前后扫描并利用标记数组来高效解决问题。

该题题意比较简单,有一个首尾相连的字符串,长度给定,从某个位置切断后,从两端开始取字符。规则为只能取颜色与首端珠子颜色相同的珠子,而首端珠子颜色如果是白色(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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值