《字典树》hdu acm 5.2.2 字典树模版

#include<iostream>
#include<cstring>
using namespace std; char str[12]; int flag; const int maxn=10; typedef struct trie { int v;
	trie *next[maxn]; }trie;
trie *root; void insert(char *str) { int i,id,j; int len=strlen(str);
	trie *p=root,*q; for(i=0;i<len;i++) {
		id=str[i]-'0'; if(p->next[id]==NULL) {
			q=(trie*)malloc(sizeof(trie));
			q->v=1; for(j=0;j<maxn;j++) {
				q->next[j]=NULL; }
			p->next[id]=q;
			p=p->next[id]; } else {
            p->next[id]->v=1;
			p=p->next[id]; } }
	p->v=-1; } int findtrie(char *str) { int len=strlen(str);
	trie *p=root; for(int i=0;i<len;i++) { int id=str[i]-'0';
		p=p->next[id]; if(p==NULL) return 0; if(p->v==-1) return -1; } return -1; } int  deal(trie* T) { int i; if(T==NULL) return 0; for(i=0;i<maxn;i++) { if(T->next[i]!=NULL)
		    deal(T->next[i]); }
	free(T); return 0; } int main() { int t,n,i;
	scanf("%d",&t); while(t--) {
		flag=0;
		root=(trie *)malloc(sizeof(trie)); for(i=0;i<10;i++)
			root->next[i]=NULL;
		scanf("%d",&n); while(n--) {
			scanf("%s",str); if(findtrie(str)==-1)
				flag=1; if(flag) continue;
			insert(str); } if(flag)
			printf("NO\n"); else
			printf("YES\n");
		deal(root); } return 0; }

你可能感兴趣的:(《字典树》hdu acm 5.2.2 字典树模版)