본문 바로가기
알고리즘/메모

트라이(Trie)

by sun__ 2020. 1. 9.

트라이의 개념은 쉽지만 글로 쓰긴 너무 길다.

 

<가장 기본 문제>

까먹었을 때 이문제만 한번 다시 풀어보면 기억 날 것.

https://www.acmicpc.net/problem/14425

#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1e4 + 4;
struct Trie {
	Trie* next[26];
	bool term;
	Trie() {
		term = false;
		for (int i = 0; i < 26; i++)
			next[i] = NULL;
	}
	~Trie() {
		for (int i = 0; i < 26; i++)
			if (next[i]) delete next[i];
	}

	void insert(char* key) {
		if (*key == NULL) {
			term = true;
			return;
		}
		int c = *key - 'a';
		if (next[c] == NULL) next[c] = new Trie();
		next[c]->insert(key + 1);
	}
	bool find(char* key) {
		if (*key == NULL) return term;
		int c = *key - 'a';
		if (next[c] == NULL) return 0;
		return next[c]->find(key + 1);
	}
};

int main() {
	int n, m; cin >> n >> m;
	Trie* root = new Trie();
	for (int i = 0; i < n; i++) {
		char input[500]; cin >> input;
		root->insert(input);
	}
	int cnt = 0;
	for (int i = 0; i < m; i++) {
		char input[500]; cin >> input;
		if (root->find(input)) cnt++;
	}
	cout << cnt << '\n';
}

 

<기본 코드>

const int ALPH = 26; //숫자 문자열이면 10
struct Trie {
	Trie* next[ALPH];
	bool term;
	Trie() {
		term = false;
		for (int i = 0; i < ALPH; i++)
			next[i] = NULL;
	}
	~Trie() {
		for (int i = 0; i < ALPH; i++)
			if (next[i]) delete next[i];
	}
    //재귀를 돌며 insert
	void insert(char* key) {
		if (*key == 0) {
			term = true;
			return;
		}
		int c = *key - '0';
		if (next[c] == NULL) next[c] = new Trie();
		next[c]->insert(key + 1);
	}
    //find함수. 이부분을 변형해서 푸는 문제가 많다. 역시 재귀로 구현
    Trie* find(const char* key) {
        if (*key == '\0') 
        	return this;//문자열이 끝나는 위치를 반환
        int curr = *key - '0';
        if (next[curr] == NULL) return NULL;//찾는 값이 존재하지 않음
        return next[curr]->find(key + 1); //다음 문자를 탐색
    }
};

 

 

'알고리즘 > 메모' 카테고리의 다른 글

비트셋 dp 문제모음  (0) 2020.01.22
multiset  (0) 2020.01.11
log2(n)값 구하기  (0) 2020.01.08
그래프 크기 구하기  (0) 2020.01.07
머지소트  (0) 2020.01.02