您的位置:首页 > 其它

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

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

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

  代码如下:

#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <map>
using namespace std;

long long rec[10005];

void getstr( char *s )
{
char c;
int cnt = 1;
while( c = getchar(), c < '0' || c > '9' ) ;
s[cnt++] = c;
while( c = getchar(), c != '\n' )
s[cnt++] = c;
s[cnt] = '\0';
}

void getlonglong( long long &x )
{
x = 1;  // 初始化为1
char c;
while( c = getchar(), c < '0' || c > '9' ) ;
x = x * 10 + c - '0';
while( c = getchar(), c >= '0' && c <= '9' )
x = x * 10 + c - '0';
}

int cmp( const void *a, const void *b )
{
return *( long long * )a - *( long long * )b;
}

int main()
{
int T;
scanf( "%d", &T );
while( T-- )
{
map<long long, bool>mp;
int N, flag = 0;
scanf( "%d", &N );
for( int i = 0; i < N; ++i )
{
getlonglong( rec[i] );
}
qsort( rec, N, sizeof( rec[0] ), cmp );
for( int i = 0; i < N; ++i )
{
long long x = rec[i];
if( mp.count( x ) == 0 )
mp[x] = true;
else
{
flag = 1;
break;
}
x /= 10;
while( x > 1 && !flag )
{
if( mp.count( x ) == 0 )
{
x /= 10;
}
else
{
flag = 1;
break;
}
}
}
printf( flag ? "NO\n" : "YES\n" );
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: