Best Position UVALive - 6808

25 篇文章 0 订阅
1 篇文章 0 订阅

枚举 + bitset

用bitset记录GL的情况
然后直接枚举每个位置为左上角时候的答案
用一个bitset清除在查询范围之外的位


char s[maxm][maxm];
char s2[maxm][maxm];
int main() {
#ifdef LOCAL
    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
#endif // LOCAL

    int n,m;
    sdd(n,m);
    for(int i=1; i<=n; ++i)scanf("%s",s[i]+1);
    int t;
    sd(t);
    r1(cas,t) {
        printf("Case #%d: ",cas);
        int x,y;
        sdd(x,y);
        bitset<maxm> a[maxm];//blueprint
        bitset<maxm> b[maxm];//farm

        for(int i=1; i<=x; ++i)scanf("%s",s2[i]+1);

        for(int i=1; i<=x; ++i)
            for(int j=1; j<=y; ++j) {
                if(s2[i][j]=='G')b[i].reset(j);
                else b[i].set(j);
            }
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=m; ++j) {
                if(s[i][j]=='G')a[i].reset(j);
                else a[i].set(j);
            }
        int tot = x*y;
        int mx = -1;
        int px = n+1 ,py = m+1;
        int g=  0,l = 0 ;
        bitset<maxm> ignore ;//消除其他位用的
        ignore.reset();
        for(int j=1; j<=y; ++j)ignore.set(j);

        for(int j=1; j+y-1<=m; ++j) {
            for(int i=1; i+x-1<=n; ++i) {
                int cnt = 0;

                for(int o=0; o<x; ++o) {
                    bitset<maxm>check = a[o+i]^b[o+1];//算不同的位置个数
                    check &= ignore;
                    cnt += check.count();
                }
                cnt = tot - cnt;
                if(cnt>mx||( cnt==mx && ( ( i < px ) || ( i==px && j < py ) ))) {
                    mx = cnt;
                    px = i,py = j;
                }
            }
            ignore.reset(j);
            if(j+y<maxm)ignore.set(j+y);
            for(int i=1; i<=x; ++i)b[i]<<=1;
        }
        for(int i=0; i<x; ++i)
            for(int j=0; j<y; ++j) {
                if(s[i+px][j+py]==s2[i+1][j+1]) {
                    if(s2[i+1][j+1]=='G')++g;
                    else ++l;
                }
            }
        printf("%d %d %d %d\n",px,py,g,l);
    }


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值