题目:有非常多工人。相应一个能力描写叙述表,每种能力有一个权值,求每一个工人的能力值。
分析:字符串。hash表,字典树。利用散列表或者字典树存储相应的单词和权值。查询就可以。
说明:注意初始化,计算完将数据清除。
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; //hash_define typedef struct hnode { char words[20]; int value; hnode* next; }hash; hash hash_node[2001]; hash* hash_table[2005]; int hash_size; int hash_initial() { hash_size = 0; memset(hash_table, 0, sizeof(hash_table)); memset(hash_node, 0, sizeof(hash_node)); } int hash_value(char *str) { int value = 0; for (int i = 0 ; str[i] ; ++ i) { value = value*26%1000; value += str[i]; } return value; } int hash_insert(char *str, int val) { int value = hash_value(str); hash_node[hash_size].value = val; strcpy(hash_node[hash_size].words, str); hash_node[hash_size].next = hash_table[value]; hash_table[value] = &hash_node[hash_size ++]; } int hash_find(char *str) { int value = hash_value(str); for (hash* p = hash_table[value] ; p ; p = p->next) if (!strcmp(p->words, str)) return p->value; return 0; } //hash_end int main() { int m,n,v; char buf[2001]; while (~scanf("%d%d",&m,&n)) { hash_initial(); for (int i = 0 ; i < m ; ++ i) { scanf("%s%d",buf,&v); hash_insert(buf, v); } for (int i = 0 ; i < n ; ++ i) { int sum = 0; while (~scanf("%s",buf)) { if (!strcmp(buf, ".")) break; sum += hash_find(buf); } printf("%d\n",sum); } } return 0; }
时间: 2024-11-08 14:28:46