HDU-1671 Phone List 暴力版 + 字典树

  该题就是判定一个所给定串集中是否有某些串是另外一些串的前缀串的问题。字典树的话很好办只要判定在构建一个串的路径中是否已经有的节点被标记(此处有串结尾)和如果一个串在该处结尾,那么是否它的的孩子都为空。

  这里写了一个暴力版,即现将所给定的所有数字用long long型存储起来,再按从小到大的顺序进行排序,之后再判定一个字符串以及它的依次去掉末位的子串是否已经存在,如果存在则输出NO,否则输出YES。在这里有一个如果不做一些处理的话是会WA的,那就是在每个数组之前加上一个1,这样使的串中的前导零有意义。

  代码如下:

 1 #include <cstring>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <map>
5 using namespace std;
6
7 long long rec[10005];
8
9 void getstr( char *s )
10 {
11 char c;
12 int cnt = 1;
13 while( c = getchar(), c < '0' || c > '9' ) ;
14 s[cnt++] = c;
15 while( c = getchar(), c != '\n' )
16 s[cnt++] = c;
17 s[cnt] = '\0';
18 }
19
20 void getlonglong( long long &x )
21 {
22 x = 1; // 初始化为1
23 char c;
24 while( c = getchar(), c < '0' || c > '9' ) ;
25 x = x * 10 + c - '0';
26 while( c = getchar(), c >= '0' && c <= '9' )
27 x = x * 10 + c - '0';
28 }
29
30 int cmp( const void *a, const void *b )
31 {
32 return *( long long * )a - *( long long * )b;
33 }
34
35 int main()
36 {
37 int T;
38 scanf( "%d", &T );
39 while( T-- )
40 {
41 map<long long, bool>mp;
42 int N, flag = 0;
43 scanf( "%d", &N );
44 for( int i = 0; i < N; ++i )
45 {
46 getlonglong( rec[i] );
47 }
48 qsort( rec, N, sizeof( rec[0] ), cmp );
49 for( int i = 0; i < N; ++i )
50 {
51 long long x = rec[i];
52 if( mp.count( x ) == 0 )
53 mp[x] = true;
54 else
55 {
56 flag = 1;
57 break;
58 }
59 x /= 10;
60 while( x > 1 && !flag )
61 {
62 if( mp.count( x ) == 0 )
63 {
64 x /= 10;
65 }
66 else
67 {
68 flag = 1;
69 break;
70 }
71 }
72 }
73 printf( flag ? "NO\n" : "YES\n" );
74 }
75 return 0;
76 }

  

你可能感兴趣的:(list)