博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【统计难题】【HDU - 1251】【map打表或字典树】【字典树模板】
阅读量:4966 次
发布时间:2019-06-12

本文共 2812 字,大约阅读时间需要 9 分钟。

思路

题意:为中文题,这里不再过多阐述。

思路1:可以在读入单词表的过程中将单词分解,用map将它一 一记录
思路2:利用字典树,这个方法较快些,下面代码中会分别给出数组和结构体指针两种形式的字典树,指针形式的有时可能会因题目内存限制而导致Memory Limit Exceeded,这时就可选择数组形式的。不过对于本题来说不用担心。

AC代码

代码1:map打表

#include
using namespace std;typedef long long LL;map
table;int main(){ std::ios::sync_with_stdio(false);// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); table.clear(); string s; while(getline(cin, s)) { if(s[0] == '\0') break; string ss = ""; for(int i = 0; i < s.size(); i++) { ss += s[i]; table[ss]++; } } while(cin >> s) { cout << table[s] << endl; }}

代码2:数组形式的字典树

#include
using namespace std;const int maxnode = 400001;const int maxs = 27;char s[10 + 10];int trie[maxnode][maxs] ;int sum[maxnode] ;int node = 0;void inserts(char *t){ int len = strlen(t); int cur = 0; for(int i = 0; i < len; i++) { int p = t[i] - 'a'; if(!trie[cur][p]) trie[cur][p] = ++node; sum[trie[cur][p]]++; cur = trie[cur][p]; }}int searchs(char *t){ int len = strlen(t); int cur = 0; for(int i = 0; i < len; i++) { int p = t[i] - 'a'; if(!trie[cur][p]) return 0; cur = trie[cur][p]; } return sum[cur];}int main(){// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); memset(trie, 0, sizeof(trie)); memset(sum, 0, sizeof(sum)); while(gets(s) != NULL) { if(s[0] == '\0') break; inserts(s); } while(scanf("%s", s) != EOF) { cout << searchs(s) << endl; }}

代码3:结构体指针形式的字典树

//#include
#include
#include
#include
using namespace std;char s[10+10];struct Trie{ Trie* next[26]; int sum; Trie() { for(int i = 0; i < 26; i++) next[i] = NULL; sum = 0; }}root;void inserts(char *s){ Trie* p = &root; int len = strlen(s); for(int i = 0; i < len; i++) { int cur = s[i] - 'a'; if(p->next[cur] == NULL) { p->next[cur] = new Trie; } p = p->next[cur]; p->sum++; }}int finds(char *s){ Trie* p = &root; int len = strlen(s); for(int i = 0; i < len; i++) { int cur = s[i] - 'a'; if(p->next[cur] == NULL) return 0; else p = p->next[cur]; } return p->sum;}int main(){// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); while(gets(s) != NULL) { if(s[0] == '\0') break; inserts(s); } while(scanf("%s", s) != EOF) { cout << finds(s) << endl; }}

转载于:https://www.cnblogs.com/KeepZ/p/11370931.html

你可能感兴趣的文章
mysql 根据日期时间查询数据
查看>>
mysql sin() 函数
查看>>
mysql upper() 函数
查看>>
socket tcp
查看>>
DataMining--Python基础入门
查看>>
单片机复位电路
查看>>
php json_decode失败,返回null
查看>>
获取单选按钮选中的值
查看>>
oracle 分页
查看>>
助教学期总结
查看>>
绘制基本 图形之矩形与多边形
查看>>
3-day3-list-truple-map.py
查看>>
Edit控件显示多行文字
查看>>
JS第二周
查看>>
dataTable.NET的search box每輸入一個字母進行一次檢索的問題
查看>>
Python 文件处理
查看>>
邻接表详解
查看>>
服务器一:分布式服务器结构
查看>>
迭代dict的value
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>