原文链接http://www.cnblogs.com/zhouzhendong/p/8284763.html


题目传送门 - HDU3718


题意概括

  直接描述输入吧

  首先一个T(T<15),表示数据组数。

  每组数据,首先三个数:len,k,m,分别表示接下来要读入的字符串的长度、每一个字符串中出现的不同字母个种类数、询问的字符串数。(len<=10000)(k<=26)(m<30)

  然后一行一个标准串。(长度为len)

  然后m行,每行一个询问串。(长度为len)

  对于询问串,每一种字母可以对应一种字母,问在最优方案下,使得对应万之后满足询问串与标准串的对应位相同的位的个数除以len的值。

  完(kou)美(hu)


题解

  我想骂人。

  容我说点难听的话。

  这题的样例数据简直就是垃圾。

  第46行的j++写成了i++居然过了样例然后实测无限TLE?

  

  言归正传。

  我们考虑每一个字母变成另一个字母得到的贡献,然后在这两个字母之间连一条边,边权为贡献。

  然后貌似就是裸的KM了。

  OK水题。


代码

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int INF=1e9+7;
const int N=30,L=10005;
int T,len,n,m,g[N][N];
char cor[L],now[L];
int ex[N],ey[N],minadd[N],match[N];
bool visx[N],visy[N];
bool Match(int x){
visx[x]=1;
for (int i=1;i<=n;i++)
if (!visy[i]){
int add=ex[x]+ey[i]-g[x][i];
if (!add){
visy[i]=1;
if (!match[i]||Match(match[i])){
match[i]=x;
return 1;
}
}
else
minadd[i]=min(minadd[i],add);
}
return 0;
}
int KM(){
memset(match,0,sizeof match);
memset(ex,0,sizeof ex);
memset(ey,0,sizeof ey);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
ex[i]=max(ex[i],g[i][j]);
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++)
minadd[j]=INF;
while (1){
memset(visx,0,sizeof visx);
memset(visy,0,sizeof visy);
if (Match(i))
break;
int d=INF;
for (int j=1;j<=n;j++)
if (!visy[j])
d=min(d,minadd[j]);
for (int j=1;j<=n;j++){
if (visx[j])
ex[j]-=d;
if (visy[j])
ey[j]+=d;
else
minadd[j]-=d;
}
}
}
int ans=0;
for (int i=1;i<=n;i++)
ans+=g[match[i]][i];
return ans;
}
void readstr(char s[]){
char ch[5];
for (int i=1;i<=len;i++){
scanf("%s",ch);
s[i]=ch[0];
}
}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d%d%d",&len,&n,&m);
n=26;
readstr(cor);
while (m--){
readstr(now);
memset(g,0,sizeof g);
for (int i=1;i<=len;i++)
g[now[i]-'A'+1][cor[i]-'A'+1]++;
printf("%.4lf\n",1.0*KM()/len);
}
}
return 0;
}

  

HDU3718 Similarity KM的更多相关文章

  1. HDU-3718 Similarity

    题目只有26个字母,所以我们新建一个二分图,v[i][j]表示字母i对应字母j时能成功匹配的个数,给这个边矩阵v求个最大匹配就是答案. #include <cstdlib> #includ ...

  2. HDU 3718 Similarity(KM最大匹配)

    HDU 3718 Similarity 题目链接 题意:给定一个标准答案字符串,然后以下每一行给一个串.要求把字符一种相应一种,要求匹配尽量多 思路:显然的KM最大匹配问题,位置相应的字符连边权值+1 ...

  3. [HDOJ3718]Similarity(KM算法,二分图最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3718 题意:有一堆答题情况和正确答案,问每一个答题情况的正确率最大是多少. 给每一对答案和答题情况的字 ...

  4. 【转】KM匹配题集

    转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...

  5. 匈牙利算法与KM算法

    匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...

  6. 机器学习中的相似性度量(Similarity Measurement)

    机器学习中的相似性度量(Similarity Measurement) 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间 ...

  7. 【HDU2255】奔小康赚大钱-KM算法

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  8. cosine similarity

    Cosine similarity is a measure of similarity between two non zero vectors of an inner product space  ...

  9. [SimHash] find the percentage of similarity between two given data

    SimHash algorithm, introduced by Charikarand is patented by Google. Simhash 5 steps: Tokenize, Hash, ...

随机推荐

  1. 前端 ----jQuery操作表单

    05-使用jQuery操作input的value值   表单控件是我们的重中之重,因为一旦牵扯到数据交互,离不开form表单的使用,比如用户的注册登录功能等 那么通过上节知识点我们了解到,我们在使用j ...

  2. Golang并发模型之Context详解

    对于 Golang 开发者来说context(上下文)包一定不会陌生.但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它. 应用场景:在 Go http 包的 Server 中,每一个 ...

  3. vuex——做简单的购物车功能

    购物车组件 <template> <div> <h1>vuex-shopCart</h1> <div class="shop-listb ...

  4. python之线程同步

    lock与rlock 使用lock不能连续两次获取锁,获取锁必须先释放锁.但是在一个线程中调用另一个函数时,在该函数中要继续操作共享的数据,这时获取锁就相当于连续执行两次获取锁,所以lock就不适用该 ...

  5. Executor多线程框架使用

    在我们的JDK1.5的时候JAVA推出一款为了更加方便开发的多线程应用而封装的框架(Executor),相比传统的Thread类,Executor更加的方便,性能好,更易于管理,而且支持线程池.一般在 ...

  6. WampServer & XAMPP Configure with MariaDB and MySQL

    第一部分补上次的一个问题 1.WampServer 3不支持的硬件格式 FAT3和 exFAT 他只能工作在NTFS的格式硬盘上. 不能在Windows XP上运行. 安装 WampServer 必须 ...

  7. poj2417 bsgs算法非逆元模板,用于求解A^x=B(mod C)的方程

    参考博客 https://blog.csdn.net/clover_hxy/article/details/50683832关于欧拉定理推论的证明 https://www.cnblogs.com/as ...

  8. cf861D 字典树+时间戳

    好久没碰字典树之类的题了,搞起来有点生疏 /* 把所有母串的后缀加入字典树中 然后再扫一次所有母串的后缀,把后缀放到字典树中查询,找到第一个访问次数为1的结点返回即可 num在计数时,同一个母串的子串 ...

  9. bzoj 3529

    非常好的一道莫比乌斯反演题,对提升自己的能力有很大帮助. 首先我们分析一下题意:题意让我们求,其中 那么我们首先对后面的式子进行一下变形,变形过程详见https://blog.csdn.net/lle ...

  10. C++ 使用system()实现锁定屏幕

    除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html 此外,也可以使用函数“system()”来实 ...