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 }

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值