1065: 图像匹配
时间限制: 1 Sec 内存限制: 32 MB提交: 28 解决: 15
题目描述
小x申请了一个创新项目,内容是进行相似图像匹配。他的实现方法是这样的:
1、 建立一个相当大的图像库,里面存放数以万计的图片,每张图片使用一个字符串命名(如A1000.bmp),字符串的长度小于或等于20字符(如A1000.bmp为9字符)。
2、 为每一张图片生成一个Hash值,这个Hash值由36位01字符串构成(如000011011101001001100001110000100111)。
3、 给出一张陌生的图片,计算它的Hash值。
4、 根据上步计算出的Hash值,比较查找图片库中与这张图片最相似的一张或几张图片。
现在小x需要你帮助他来完成第4步,即小x给出图片名和Hash值,由你在图片库中查找一张或几张最相似的图片,输出图片名、相似度。
相似度这样计算:36 - 两个Hash值的汉明距离,相似度越大,两张图片越接近。
汉明距离这样计算:两个等长字符创之间的汉明距离是两个字符串对应位置的字符不同的个数,如10000和01001之间的汉明距离是3,10000和10001之间的汉明距离是1。
输入
多组测试数据 ,对于每组数据:
第一行为一个整数N,表示图像库中的图片数目(0 < N <= 10000)
接下来N行,每行为图片名和对应的36位Hash值,图片名和Hash值之间由一个空格隔开。
第N+2行为一个整数Q,表示接下来要匹配的图片数目(0 < Q <= 100)
接下来Q行,每行为待匹配的图片名和对应的36位Hash值,图片名和Hash值之间由一个空格隔开
输出
对于每组数据:
对于每张待匹配的图片,第一行输出一个整数X,表示图片库中有X张图片与它最相似。
第二行输出一个整数,是图片的相似度。
接下来X行,每行输出一张图片的名称。
注意当有多张图片可以匹配时,按输入中图片给出的顺序排列。
样例输入
样例输出
题目链接:http://xcacm.hfut.edu.cn/problem.php?id=1065
竟然是水题
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<deque>
#include<cmath>
#include<climits>
#include<list>
#include<utility>
#include<memory>
#include<cstddef>
#include<iterator>
#include<iomanip>
using namespace std;
typedef long long LL;
typedef long double LD;
const double PI = acos(-1.0);
///
int judge(char *a, char *b) {
int res = 36;
int len = 36;
for (int i = 0; i < len; i++) {
if (a[i] != b[i]) {
res--;
}
}
return res;
}
struct inf {
char name[36];
char hash[36];
};
///
int main(int argc, char**argv) {
ios_base::sync_with_stdio(0); cin.tie(0);
//freopen("input.txt", "r", stdin);?
//freopen("output.txt", "w", stdout);
int m;
scanf("%d", &m);
struct inf st[10007];
for (int i = 1; i <= m; i++) {
scanf("%s%s", st[i].name, st[i].hash);
}
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
char c[36], d[36];
scanf("%s%s", c, d);
int sc[10003];
int max = -1;
for (int j = 1; j <= m; j++) {
sc[j] = judge(d, st[j].hash);
if (max < sc[j]) {
max = sc[j];
}
}
int num = 0;
for (int j = 1; j <= m; j++) {
if (sc[j] == max) num++;
}
printf("%d\n", num);
printf("%d\n", max);
for (int j = 1; j <= m; j++) {
if (sc[j] == max) {
printf("%s\n", st[j].name);
}
}
}
//system("pause");
return 0;
}
//END