CF 948 DIV.2 D. XORificator

考虑对每个设置为1且唯一
那么我们发现对于所有的状态都是确定且唯一的
那么我们对于每个点假设它为1且为该列唯一
对于除它之外的点的状态进行存储
又由于这个值过于大
我们考虑使用哈希存储
那么出现次数最多的值即为答案

点击查看代码
map<ull,int>cnt;
map<ull,pii>pos;
void solve(){
    cnt.clear(),pos.clear();
    int n,m;cin>>n>>m;
    vector<vector<int>>a(n+1,vector<int>(m+1));
    string s;
    for(int i=1;i<=n;i++){
        cin>>s;
        for(int j=1;j<=m;j++)a[i][j]=s[j-1]-'0';
    }
    for(int j=1;j<=m;j++){
        ull H=0;
        for(int i=1;i<=n;i++)H=H*B+a[i][j];
        for(int i=1;i<=n;i++){
            ull H0=H;
            if(a[i][j]==0)H0+=pw[n-i];
            else H0-=pw[n-i];
            if(!cnt[H0])pos[H0]=make_pair(i,j);
            cnt[H0]++;
        }
    }
    int f1=0;ull mx=0;
    for(auto it:cnt){
        if(!f1){
            mx=it.first;
            f1=1;continue;
        }
        if(it.second>cnt[mx])mx=it.first;
    }
    cout<<cnt[mx]<<'\n';
    int x=pos[mx].first,y=pos[mx].second;
    for(int i=1;i<=n;i++){
        if((i==x)^a[i][y])cout<<1;
        else cout<<0;
    }
    cout<<'\n';
}
参考by https://www.luogu.com.cn/article/kwqplv51
posted @ 2024-05-29 17:25  archer2333  阅读(28)  评论(0)    收藏  举报