1. 程式人生 > >Trie樹_POJ3630_Phone List

Trie樹_POJ3630_Phone List

點此開啟題目頁面

思路分析:

    將輸入字串按照長度非遞減排序, 然後直接應用Trie樹即可, 具體見如下AC程式碼:

//POJ3630_Phone List
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 1e4 + 5;
int trie[MAX * 10][10], tot; bool end[MAX * 10];
char s[MAX][15]; 
pair<int, int> slen[MAX];//firsr:長度, second在s中一維下標 
int main(){
	int t; scanf("%d", &t);
	while(t--){
		memset(trie, 0, sizeof(trie)), memset(end, false, sizeof(end)), tot = 0;
		int n; scanf("%d", &n);
		bool yes = true;
		for(int i = 1; i <= n; ++i) 
			scanf("%s", s[i] + 1), slen[i] = make_pair(strlen(s[i] + 1), i);
		sort(slen + 1, slen + n +1);
		for(int i = 1; i <= n; ++i){
			int k = 0;
			for(int j = 1, len = slen[i].first; j <= len; ++j){
				int b = s[slen[i].second][j] - '0';
				if(!trie[k][b]) trie[k][b] = ++tot;
				else if(end[trie[k][b]]) yes = false;
				k = trie[k][b];		
			}
			end[k] = true;
		}
		cout << (yes? "YES": "NO") << endl;
	}	
	return 0;
}