CF 948 DIV.2 D. XORificator

archer2333發表於2024-05-29

考慮對每個設定為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