题目描述
Farmer John 的 N 个牛棚都会选出包含 C 只奶牛的队伍去参加户外聚会。所有奶牛的品种都只可能是根西牛(G)或荷斯坦奶牛(H)。我们将两个奶牛队伍中,同一位置对应的两头奶牛品种不同的所有位置 i(1≤i≤C) 的个数,定义为的两个奶牛队伍的差异。对于编号1...N 的每个奶牛队伍 t ,请计算出t和其它所有队伍的差异的最大值。
输入格式
第一行包含两个整数 C 与 N。 接下来 N 行,每行有一个长度为 C 的,仅包含字母 G 和 H 的字符串,每行对应一支奶牛队伍。
输出格式
对于每个队伍,输出差异最大值。
输入
5 3
GHGGH
GHHHH
HGHHG
输出
5
3
5
题目解析
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int m,n,s[N],mp[N];
struct node{
int s,d;
node(int s=0,int d=0):s(s),d(d){}
}tmp;
queue<node> q;
string str;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>m>>n;
for(int i=1;i<=n;++i){
cin>>str;int t=0;
for(int j=0;j<m;++j)s[i]=s[i]*2+(str[j]=='G'),t=t*2+(str[j]=='H');
mp[t]=1;q.push(node(t,1));
}
while(!q.empty()){
node u=q.front();q.pop();
for(int i=0;i<m;++i){
int t=(u.s^(1<<i));
if(!mp[t])mp[t]=u.d+1,q.push(node(t,u.d+1));
}
}
for(int i=1;i<=n;++i)cout<<m-mp[s[i]]+1<<endl;
return 0;
}