专栏文章

汉明距离相关应用

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimzrt5a
此快照首次捕获于
2025/12/01 18:13
3 个月前
此快照最后确认于
2025/12/01 18:13
3 个月前
查看原文
定义:s,ts,t 的汉明距离定义为 i=1s[siti]\sum_{i=1}^{|s|} [s_i \not = t_i]

P9187 [USACO23OPEN] Field Day S

给点 nn 个长度为 cc 的字符串,对每一个字符串找到另外一个字符串,使其汉明距离最大。
观察到 cc 很小,围绕值域入手。fif_i 表示 ii 到最远的目标字符串的最大距离。
考虑建图 xx2kx \to x\oplus 2^k 连边,边权为 11,这样要跑最长路。反过来,求最少相同位数,fif_i 表示 ii 与目标状态的最少相同位数,这样可以直接跑 bfs。
codeCPP
#include <bits/stdc++.h>
#define umap unordered_map
#define vint vector<int>
#define ll long long
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define ull unsigned long long
#define uint unsigned int
#define rg register
#define il inline
#define db double
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define sqr(x) ((x)*(x))
using namespace std;
const int INF=0x3f3f3f3f,mod=1e9+7;
const long long INFL=0x3f3f3f3f3f3f3f3f;
const double eps=1e-8;
il int read(){
    int w=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        w=(w<<1)+(w<<3)+(ch^48);
        ch=getchar();
    }
    return w*f;
}
il void chkmax(int &x,int y){x=(x<y)?y:x;}
il void chkmin(int &x,int y){x=(x>y)?y:x;}

const int N=1e5+10,V=18;
int a[N],dis[(1<<V)+10],vis[(1<<V)+10];
int n,c;
int main(){
    #ifndef ONLINE_JUDGE
    //freopen("in.txt","r",stdin);
    #endif
    cin>>c>>n;
    queue<int> Q;
    memset(dis,0x3f,sizeof(dis));
    rep(i,1,n){
        char ch;
        int x=0,y=0;
        rep(j,1,c){
            cin>>ch;
            x=(x<<1)+(ch=='G'),y=(y<<1)+(ch=='H');
        }
        a[i]=x;
        dis[y]=0,Q.push(y);
    }
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=0;i<c;++i){
            int v=u^(1<<i);
            if(dis[v]>dis[u]+1){
                dis[v]=dis[u]+1;
                Q.push(v);
            }
        }
    }
    rep(i,1,n){
        cout<<c-dis[a[i]]<<"\n";
    }
    #ifndef ONLINE_JUDGE
    fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
    #endif
    return 0;
}

CF1186C Vus the Cossack and Strings

一个结论:0101 字符串的汉明距离为偶数当且仅当 11 的个数同余。

评论

0 条评论,欢迎与作者交流。

正在加载评论...