POJ3630 Phone List (Trie树)

POJ3630 Phone List (Tire树)


题目大意:

  • 给 n 串电话号码 , 如果有任意号码是其他号码的前缀,就输出 NO ,否则输出 YES

解题过程:

  • 思路是利用trie树(字典树)来解决.
  • 但在写代码的过程中,开始是每次遇到错误的情况就输出并且break,这到这了我不会将所有的电话号码都读入,而将一部分电话号码放到下一组数据的bug.

AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define rep(i,l,p) for(int i =l;i<=p;i++)
#define fread() freopen("in.txt","r",stdin)

int T,n;
int tr[100005][11];
bool endf[100005];
int tot,nx;
char s[15];
int main(int argc, char const *argv[])
{
    // fread(); 
    scanf("%d",&T);
    while(T--){

        memset(endf,false,sizeof(endf));
        memset(tr,0,sizeof(tr));

        tot = 0;

        scanf("%d",&n);
        bool flag = true;
        rep(i,1,n){
            scanf("%s",s);
            nx = 0;
            int len = strlen(s);
            int num;
            rep(j,0,len-1){
                num = s[j] - '0';

                if( j == len-1 && tr[nx][num] != 0){
                    flag = false;
                }

                if(tr[nx][num] == 0) tr[nx][num] = ++tot;
                nx = tr[nx][num];

                if(endf[nx]){
                    flag = false;
                }

            }
            endf[nx] = true;

        }
        if(flag) printf("YES\n");
        else printf("NO\n");

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Hagtaril/article/details/79881734