Trie入门--Poj3630 Phone List

就Trie的插入和查找

//注意此题是找到前缀输出no,否则输出yes 
#include<bits/stdc++.h>
using namespace std;
int n,t,flag,cnt,trie[110001][21];
int ed[110001],vis[110001];
char ch[21];
void up()
{
    flag=0;cnt=0;
    memset(ed,0,sizeof(ed));
    memset(vis,0,sizeof(vis));
    memset(trie,0,sizeof(trie));
}
void find()
{
    int nxt=0,len=strlen(ch+1);
    for(int i=1;i<=len;i++)
	{
        int num=ch[i]-'0';
        if(!trie[nxt][num])
		     trie[nxt][num]=++cnt;
        nxt=trie[nxt][num];
        //取出它的下一条边 
        if(vis[nxt]&&i==len)
        //如果这条边已存在,且i==len,则说明找到前缀 
		{ 
		     flag=1;
			 return;
		}
        vis[nxt]=1;
        // 加入这条边到trie中 
        if(ed[nxt])
        //如果这条边被打上结尾标记的话 
		   {  
		        flag=1;
				return;
		   }
    }
    ed[nxt]=1;
    //打上结尾标记 
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);up();
        for(int i=1;i<=n;i++)
		{
            scanf("%s",ch+1);
            if(!flag)
			   {
			      find();
			      
			   }
        }
        if(flag)
		     printf("NO\n");
        else 
		     printf("YES\n");
    }
    return 0;
}

  

上一篇:hdu2767(利用tarjan将图变成强连通图)


下一篇:Codeforces 1294C Product of Three Numbers(质因子分解)