<题目链接>
题目大意:
给你一堆字符串,让你按字典序输出他们出现的频率.
解题分析:
首先,这是Trie数词频统计的题目,以Trie树的边储存字母,节点存储以该节点结尾的链所代表的字符串的数量,最后用dfs寻找Trie树中所有的单词,下面代码是用数组实现的Trie树。当然,本题也可用快排或者map直接水过。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN = 10000*35; 7 const int SIZE = 130; //ASCII中有128个常用字符 8 char str[40]; 9 int all; 10 struct Trie{ 11 int ch[MAXN][SIZE]; 12 int num[MAXN]; 13 int pos; //sz为遍历到该节点的编号 14 void init(){ 15 pos = 1; 16 memset(ch[0],0,sizeof(ch[0])); 17 } 18 int idx(char c){return c - ' ';} //因为本题的字符范围是所有字符,所以这里是减去字符中ASCII最小的 ' '(空格) 19 void insert(char *s){ 20 int now = 0,n = strlen(s); 21 for(int i=0;i<n;i++){ 22 int next = idx(s[i]); 23 if(!ch[now][next]){ //如果该节点没遍历过,那么就新建该节点 24 memset(ch[pos],0,sizeof(ch[pos])); //注意这里是ch[pos],而不是ch[now],因为now之前可能已经由其它的子节点了 25 ch[now][next] = pos++; //若该节点没被遍历过,给该节点编号 26 num[now] = 0; 27 } 28 now = ch[now][next]; 29 } 30 num[now]++; 31 } 32 void dfs(int u,int t){ 33 str[t] = '