POJ-3630 Phone List Trie树 | qsort

  题目链接:http://poj.org/problem?id=3630

  建立一个Trie树查找就可以了,但是这里动态建立Trie居然会超时,静态化居然可以秒,太不厚道了= =

  当然还可以用qsort秒过,依次比较。。。

 1 //STATUS:C++_AC_110MS_2568KB

 2 #include<stdio.h>

 3 #include<stdlib.h>

 4 #include<string.h>

 5 #include<math.h>

 6 #include<iostream>

 7 #include<string>

 8 #include<algorithm>

 9 #include<vector>

10 #include<queue>

11 #include<stack>

12 #include<map>

13 using namespace std;

14 #define LL long long

15 #define pii pair<int,int>

16 #define Max(a,b) ((a)>(b)?(a):(b))

17 #define Min(a,b) ((a)<(b)?(a):(b))

18 #define mem(a,b) memset(a,b,sizeof(a))

19 #define lson l,mid,rt<<1

20 #define rson mid+1,r,rt<<1|1

21 #define PI acos(-1.0)

22 const int N=10010,INF=0x3f3f3f3f,MOD=10000,STA=8000010;

23 const LL LNF=0x3f3f3f3f3f3f3f3f;

24 const double DNF=1e13;

25 //

26 void swap(int& a,int& b){int t=a;a=b;b=t;}

27 void swap(LL& a,LL& b){LL t=a;a=b;b=t;}

28 //

29 

30 struct Trie {

31     int ch[1<<16][10];

32     int val[1<<16];

33     int sz;

34 

35     void init(){sz=1;mem(ch[0],0);}

36     void insert(char *s,int v){

37         int i,len=strlen(s),id,u=0;

38         for(i=0;i<len;i++){

39             id=s[i]-'0';

40             if(!ch[u][id]){

41                 mem(ch[sz],0);

42                 val[sz]=0;

43                 ch[u][id]=sz++;

44             }

45             u=ch[u][id];

46         }

47         val[u]=v;

48     }

49     int find(char *s){

50         int i,len=strlen(s),id,u=0;

51         for(i=0;i<len;i++){

52             id=s[i]-'0';

53             if(!ch[u][id])return 0;

54             u=ch[u][id];

55         }

56         for(i=0;i<10;i++)

57             if(ch[u][id])return 1;

58         return 0;

59     }

60 }trie;

61 

62 int T,n;

63 char s[12];

64 

65 int main()

66 {

67  //   freopen("in.txt","r",stdin);

68     int i,j,ok;

69     scanf("%d",&T);

70     while(T--)

71     {

72         ok=1;

73         trie.init();

74         scanf("%d",&n);

75         while(n--){

76             scanf("%s",s);

77             if(trie.insert(s,1)){ok=0;break;}

78         }

79         if(n>1)while(n--)scanf("%s",s);

80 

81         printf("%s\n",ok?"YES":"NO");

82     }

83     return 0;

84 }

 

你可能感兴趣的:(list)