http://poj.org/problem?id=3276
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=5005;
int n;
int dir[maxn];//牛的方向(0:F,1:B)
int f[maxn];//区间[i,i+K-1]是否进行反转
int calc(int K){
memset(f,0,sizeof(f));
int res=0;
int sum=0;//循环到某位置时该位置已经反转过多少次
for(int i=0;i+K<=n;i++){//计算区间[i,i+K-1]
if((dir[i]+sum)%2!=0){//如果前端的牛面向后方
res++;
f[i]=1;
}
sum+=f[i];
if(i-K+1>=0){
sum-=f[i-K+1];
}
}
for(int i=n-K+1;i<n;i++){
if((dir[i]+sum)%2!=0){
return -1;
}
if(i-K+1>=0){
sum-=f[i-K+1];
}
}
return res;
}
void solve(){
int K=1,M=n;
for(int k=1;k<=n;k++){
int m=calc(k);
if(m>=0&&M>m){
M=m;
K=k;
}
}
cout<<K<<' '<<M<<endl;
}
int main(){
while(cin>>n){
char tmp;
for(int i=0;i<n;i++){
cin>>tmp;
if(tmp=='B'){
dir[i]=1;
}
else dir[i]=0;
}
solve();
}
return 0;
}