之前写了一篇POJ 3276,是用mod 2实现将int类型数据优化成bool类型数据,降低了空间复杂度。在看了高斯消元法后,这一篇使用异或运算实现mod 2的加减法,又加快了几十毫秒。
/*Memory 144K Time 375MS*/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int N;
const int MAXN = 5000;
bool dir[MAXN+1], f[MAXN+1];
int calc(int K){
memset(f, 0, sizeof(f));
int res = 0;
bool sumi = 0;
int i;
for(i=0; i+K-1<N; i++){
if(sumi^dir[i]){
res++;
f[i] = 1;
}
if(i-K+1 < 0) sumi ^= f[i];
else sumi ^= (f[i]^f[i-K+1]);
}
for( ; i<N; i++){
if(sumi^dir[i]) return -1;
sumi ^= 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;
}
}
printf("%d %d\n", K, M);
}
int main(){
while(scanf("%d", &N) != EOF){
char ch;
int cnt = 0;
while(cnt < N){
scanf("%c", &ch);
if(ch == 'F') dir[cnt++] = 0;
if(ch == 'B') dir[cnt++] = 1;
}
solve();
}
return 0;
}