您的位置:首页 > 其它

USACO基础第三题Broken Necklace

2011-02-18 18:18 411 查看
做完第三题发现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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: