杭电OJ 1251 统计难题 字典树入门

字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。杭电OJ 1251 统计难题 字典树入门_第1张图片

它有3个基本性质:
1.根节点不包含字符,除根节点外每一个节点都只包含一个字符;
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
3.每个节点的所有子节点包含的字符都不相同。
#include 
#include 
using namespace std;
struct node{
	int num;   //记录多少单词途径该节点,即多少单词拥有以该节点为末尾的前缀
	node *next[26]; //26个子节点,用来代表26个不同字母   0存a ,1存b 。。。
};
node root,*newnode;
void insert(char *a, int len){
	node *cur = &root;  //当前结点移动到根节点
	for (int n = 0; n < len; n++){//遍历串中所有字符
		if (cur->next[a[n]-'a'] == NULL){//检查结点中是否含有a[n]-'a'所代表的字母
			 newnode = new node;
			 for (int i = 0; i < 26; i++)
				 newnode->next[i] = NULL;
			 newnode->num = 1;
			 cur->next[a[n] - 'a'] = newnode;  //新建一个结点并置于当前的后一个结点
			 cur = newnode;  //当前结点移动的新建结点;
		}
		else{   //如果某一结点的下一结点不为空
			cur = cur->next[a[n] - 'a'];
			cur->num++;
		}
	}
}
int find(char *a, int len){
	node *cur = &root;    //从根节点开始
	for (int n = 0; n < len; n++){
		if (cur->next[a[n] - 'a'] != NULL)
			cur = cur->next[a[n] - 'a'];
		else
			return 0;
	}
	return cur->num;
}
int main(){
	char c[1000];
	while (cin.getline(c, 1000) && strlen(c) != 0){
		insert(c, strlen(c));      
	}
	while (cin.getline(c, 1000)){
		cout << find(c, strlen(c)) << endl;
	}
}

你可能感兴趣的:(字符串处理)