POJ 3276(第二篇)开关问题

来源:互联网 发布:软件自带音效 编辑:程序博客网 时间:2024/06/01 13:00

之前写了一篇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;}


0 0