hihocoder1014 Trie树

题目链接:http://hihocoder.com/problemset/problem/1014

题目大意,给出了若干个串为字典,然后询问若干个串,问字典中有多少串是以这些串为开头的(前缀)

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

#define MAX_N 1000100
#define MAX_C 26

struct Trie {
	int *ch[MAX_N];
	int tot;
	int cnt[MAX_N];
	
	Trie() {
		tot = 0;
		memset( ch, 0, sizeof(ch) );
		memset( cnt, 0, sizeof(cnt) );
	}
	
	void insert( const string s ) {
		int p = 0;
		for ( int i = 0, len=s.size() ; i < len ; ++ i ) {
			if ( ch[p] == NULL ) {
				ch[p] = new int[MAX_C];
				memset( ch[p], -1, sizeof(int)*MAX_C );
			} 
			if ( ch[p][s[i]-'a'] == -1 ) {
				ch[p][s[i]-'a'] = ++tot;
			}
			p = ch[p][s[i]-'a'];
			cnt[p] ++;// 经过结点p的值+1 
		}
		
	}
	
	int find( const string s ) {
		int p = 0;
		for ( int i = 0 , len = s.size() ; i < len ; ++ i ) {
			if ( ch[p] == NULL ) return 0; 
			if ( ch[p][s[i]-'a'] == -1 ) {
				return 0;
			}
			p = ch[p][s[i]-'a'];
		}
		return cnt[p];// 返回结点p的值 
	}
};

Trie trie;
int main()
{
	string s;
	int n;
	cin >> n;
	for ( int i = 0 ; i < n ; ++ i ) {
		cin >> s;
		trie.insert(s);
	}
	cin >> n;
	for ( int i = 0 ; i < n ; ++ i ) {
		cin >> s;
		cout << trie.find(s) << endl;
	}
	
	return 0;
}

    原文作者:Trie树
    原文地址: https://blog.csdn.net/hopyGreat/article/details/79730682
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注