请问位运算与逻辑运算是位运算更快吗
查看原帖
请问位运算与逻辑运算是位运算更快吗
991651
wangmingrui123456楼主2025/8/30 21:19

这是我有一次的代码,TLE,打 7070 分。

#include<bits/stdc++.h>
using namespace std;
int n,ans,m1,m2,m3,flag[15];
void dfs(int k){
    if(k>n){
        ans++;
        return;
    }
    for(int j=1;j<=n;j++){
        if(!(m1&1<<j||m2&1<<k+j||m3&1<<k-j+n)&&flag[k]&1<<j){
	        m1|=1<<j;
	        m2|=1<<k+j;
	        m3|=1<<k-j+n;
	        dfs(k+1);
	        m1^=1<<j;
	        m2^=1<<k+j;
	        m3^=1<<k-j+n;
		}
    }
}
int main(){
    memset(flag,-1,sizeof(flag));
	scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            char c;
            cin>>c;
            if(c=='.')flag[i]^=1<<j;
        }
    }
	dfs(1);
	printf("%d",ans);
	return 0;
}

这是我 AC 代码(时间卡的很死,只差了几毫秒):

#include<bits/stdc++.h>
using namespace std;
int n,ans,m1,m2,m3,flag[15];
void dfs(int k){
    if(k>n){
        ++ans;
        return;
    }
    for(int j=1;j<=n;++j){
        if(!(m1&1<<j|m2&1<<k+j|m3&1<<k-j+n)&&flag[k]&1<<j){
	        m1|=1<<j;
	        m2|=1<<k+j;
	        m3|=1<<k-j+n;
	        dfs(k+1);
	        m1^=1<<j;
	        m2^=1<<k+j;
	        m3^=1<<k-j+n;
		}
    }
}
int main(){
    memset(flag,-1,sizeof(flag));
	scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            char c;
            cin>>c;
            if(c=='.')flag[i]^=1<<j;
        }
    }
	dfs(1);
	printf("%d",ans);
	return 0;
}

我发现这里仅仅只把第 1010 行的逻辑或运算改成了位或运算,就正确了,这请 dalao 解释一下,谢谢。(必关)

2025/8/30 21:19
加载中...