trie.cpp
Trie - Lưu giá trị tương ứng với xâu
Bài toán
Mọi người muốn mua xe và đăng ký biển số xe. Khi một người tên là xxx đến phòng đăng kí, nếu ông xxx đã đăng kí biến số xe thì nói cho ông ấy biết biển số xe của ông ấy, nếu ông ấy chưa có biển số xe thì cập cho ông ấy một biển số xe. (Coi biển số xe là một số nguyên)
Rất nhiều bài đồ thị cho mạng lưới các thành phố và danh sách đường đi. Chúng ta rất cần mã hóa tên các thành phố này thành số để tiện xử lý.
Độ phức tạp
đọc và gán : O(m) với m là độ dài tên của ông xxx
Sample Input
DDat
TuanGay
DDat
LinhChoCon
Sample Output
1
2
1
3
trie.cpp
#include <stdio.h>
#include <vector>
using namespace std;
// trie
class trie {
public :
struct node {
int a[64];
int value;
int& operator[] (int i){ return a[i%64]; }
node() { for (int i=0; i<64; i++) a[i]=0; value=0; }
};
vector <node> a;
int& operator[] (char *s){
int pos=0, i, c;
for (i=0; c=s[i]; i++)
{
if (a[pos][c]==0) {
a.push_back(node());
a[pos][c] = a.size()-1;
}
pos=a[pos][c];
}
return a[pos].value;
}
void clear(){ a.clear(); a.push_back(node()); }
trie(){ clear(); }
};
trie tr;
// main
main(){
int cnt=0;
char s[2309];
for(;;){
gets(s);
if (tr[s]==0) tr[s]=++cnt;
printf("%s = %d\n", s, tr[s]);
}
}
Nhận xét
Khá ngắn gọn và dễ nhớ, rất hiệu quả, nhanh hơn rất nhiều so với việc dùng map và an toàn hơn việc hash.