1. 程式人生 > 實用技巧 >ACwing(基礎) --- Trie樹

ACwing(基礎) --- Trie樹

什麼是Trie樹

trie,又稱字首樹或字典樹,是一種有序樹,用於儲存關聯陣列,其中的鍵通常是字串。 與二叉查詢樹不同,鍵不是直接儲存在節點中,而是由節點在樹中的位置決定。 一個節點的所有子孫都有相同的字首,也就是這個節點對應的字串,而根節點對應空字串。

Trie字串統計

#include<iostream>

using namespace std;

const int N = 1e5+10;

int son[N][26] , cnt[N],idx;//下標是0的點,既是根節點,又是空節點 
char str[N];

void insert(char str[]){
	int p = 0;
	for(int i = 0; str[i]; i ++){
		int u = str[i] - 'a';
		if(!son[p][u]) son[p][u] = ++ idx;
		p = son[p][u];
	}
	
	cnt[p] ++ ; 
}

int query(char str[]){
	int p = 0;
	for(int i = 0; str[i]; i ++ ){
		int u = str[i];
		if(!son[p][u]) return 0;
		p = son[p][u];
	}
	return cnt[p];
} 

int main(){
	int n;
	cin>>n;
	while(n -- ){
		char op[2];
		cin>>op>>str;
		if(op[0] == 'I') insert(str);
		else printf("%d\n",query(str));
	}
	return 0;
}