USACO基础第三题Broken Necklace

做完第三题发现USACO真是个好地方,推荐acm没有入门的同学上去刷通关,据说大牛的一个月就通关,一般就得四五个月。我觉得usaco最好的一个地方就是会给测试数据,错误会有一些提示什么的,而且怎么提交也没人管,虽然多次提交这习惯不好,但是可能很多人还不是熟悉文件的操作。

/*
ID: like_091
PROG: beads
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const short MAX = 1000;
char s[MAX];
int prv[MAX], nex[MAX], v[MAX];
void change(int n)
{
	short i;
	//预处理
	for (i = 1; i <= n; i++)
	{
		if (i == 1)prv[i] = n;
		else prv[i] = i - 1;
	}
	for (i = 1; i <= n; i++)
	{
		if (i == n)nex[i] = 1;
		else nex[i] = i + 1;
	}
}
int fun(int x, int n)
{
	int i = x, j = prv[x], sum;
	short l;
	for (l = 1; l <= n; l++)
		v[l] = 0;//标记状态数组
	sum = tot = 0;
	while (!v[i] && s[i] == 'w')
	{
		sum++; v[i] = 1; i = nex[i];
	}
	char temp = s[i];
	while (!v[i] && (s[i] == temp || s[i] == 'w'))
	{
		sum++; v[i] = 1; i = nex[i];
	}
	while (!v[j] && s[j] == 'w')
	{
		sum++; v[j] = 1; j = prv[j];
	}
	temp = s[j];
	while (!v[j] && (s[j] == temp || s[j] == 'w'))
	{
		sum++; v[j] = 1; j = prv[j];
	}
	return sum;
}
int main(void)
{
	ifstream cin("beads.in");
	ofstream cout("beads.out");
	short n, i;
	while (cin>>n)
	{
		int m = -1;
		for (i = 1; i <= n; i++)
			cin>>s[i];//每次输入一个字符
		change(n);
		for (int i = 1; i <= n; i++)
			if (m < fun(i, n))
				m = fun(i, n);
		cout<<m<<endl;
	}
	return 0;
}
posted @ 2011-02-18 18:18  like@neu  阅读(226)  评论(0编辑  收藏  举报