poj 3276 题目链接:http://poj.org/problem?id=3276
通过啦!
//#include <bits/stdc++.h>
#include <map>
#include <set>
#include<iostream>
#include <stdio.h>
#include<cstring>
#define LL long long int
using namespace std;
int N;
const int MM=5000;
int cow[MM];
int f[MM];
int calculate(int k){
int ans=0; int sum=0;
memset(f,0,sizeof(f));
// 1 , 2, 3 ,4 , N-k-1, N-k, N-k+1, N-k+2 ,N-2,N-1, N
for(int i=1; i<=N-k+1;i++){
if( ( sum + cow[i] ) %2 != 0 ) {
ans++;
f[i]=1;
}
sum += f[i];
if( (i-k+1) > 0) sum -= f[i-k+1]; //为下一次判断做好准备
}
//检查最后k-1头牛
for( int i=N-k+2;i<=N;i++ ){
if( ( sum + cow[i] )%2 !=0 ) {return -1;}
if( (i-k+1) >0) sum -= f[i-k+1];
}
//cout << k<< endl;
//for(int i=1;i<=N;i++) {cout << i << "f[i]:"<< f[i] << " " ;} cout << endl;
return ans;
}
int main()
{
cin >> N;
for(int i=1;i<=N;i++){
//scanf("%d",&a[i]);
char c; cin>>c;
cow[i] = ( c=='B'?1:0);
}
// for(int i=1;i<=N;i++){
// cout << cow[i] << " ";
// }
int M =N, K = 1;
for(int k=1;k<=N;k++){
int m = calculate(k);
if( m>=0 && m < M){ K=k; M=m; }
}
cout<< K <<" "<< M;
return 0;
}