专栏文章
汉明距离相关应用
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mimzrt5a
- 此快照首次捕获于
- 2025/12/01 18:13 3 个月前
- 此快照最后确认于
- 2025/12/01 18:13 3 个月前
定义: 的汉明距离定义为 。
P9187 [USACO23OPEN] Field Day S
给点 个长度为 的字符串,对每一个字符串找到另外一个字符串,使其汉明距离最大。
观察到 很小,围绕值域入手。 表示 到最远的目标字符串的最大距离。
考虑建图 连边,边权为 ,这样要跑最长路。反过来,求最少相同位数, 表示 与目标状态的最少相同位数,这样可以直接跑 bfs。
code
CPP#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
一个结论: 字符串的汉明距离为偶数当且仅当 的个数同余。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...