poj 3630 Phone List

简介:

#include<iostream> 
#include<cstdio>
#include<cstring>
#define N 100005
using namespace std;
int Trie[N][10];
int nodeN;
int main()
{
int t, n, i, j, isPrefix, flag;
char ph[15];
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
isPrefix=0;
nodeN=0; 
memset(Trie[0], 0, sizeof(int)*10);
for(i=0; i<n; ++i)
{
  scanf("%s", ph);
  flag=0;
  int cur=0; 
  if(!isPrefix)
  for(j=0; ph[j]; ++j)
  {
    int k=ph[j]-'0';
    if(!Trie[cur][k])
    {
      if(i!=0 && !flag)//利用第一个字符串建立一个初始的trie树
      {
          flag=1;//建立了新节点(如果当前 cur 节点还有孩子说明没有公共前缀, 否则说明当前路已经走到了尽头,产生了公共前缀)
          int c;
         for(c=0; c<10; ++c)//检查时候当前节点cur是否有孩子节点
        if(Trie[cur][c])
         break;
      if(c>=10) 
      {
          isPrefix=1; //没有孩子节点,则说明产生了公共前缀
        break;
       }
     }
       Trie[cur][k]=++nodeN;
       memset(Trie[nodeN], 0, sizeof(int)*10);
     }
     cur=Trie[cur][k];
   } 
  if(flag==0 && i!=0)//如果不是第一个字符串,而且在遍历整个树的时候没有发现建立新的节点,则说明当前字符串必然是之前某个字符串的公共前缀
    isPrefix=1;
 }
  if(isPrefix)
    printf("NO\n");
  else printf("YES\n");
}
return 0;
}

 /*
  好不容易想用一下链表来写一下,还超时啊。。。。
*/
#include<iostream> 
#include<cstdio>
#include<cstring>
using namespace std;
class Trie
{
 public:
   Trie *ch[10];
   Trie()
   {
      memset(ch, 0, sizeof(ch));
   }
};

int main()
{
   int t, n, i, j, isPrefix, flag;
   char ph[15];
   scanf("%d", &t);
   while(t--)
   {
      scanf("%d", &n);
      Trie *root=new Trie();
      isPrefix=0;
      for(i=0; i<n; ++i)
      {
           scanf("%s",  ph);
           flag=0;
           Trie * cur=root; 
           if(!isPrefix)
            for(j=0; ph[j]; ++j)
            {
              int k=ph[j]-'0';
              if(!cur->ch[k])
              {
                  if(i!=0 && !flag)
                  {
                     flag=1;
                     int c;
                     for(c=0; c<10; ++c)
                       if(cur->ch[c])
                         break;
                     if(c>=10) 
           {
              isPrefix=1; 
              break;
               }
                  }
                 cur->ch[k]=new Trie();
        }
        cur=cur->ch[k];
      } 
     if(flag==0 && i!=0)
        isPrefix=1;
      }
      if(isPrefix)
         printf("NO\n");
      else printf("YES\n");
   }
   return 0;
}

目录
相关文章
poj 3630 Phone List
1 #include 2 #include 3 #include 4 #define N 100005 5 using namespace std; 6 int Trie[N][10]; 7 int nodeN; 8 int main() 9 { 10 in...
652 0
hdu 1671 Phone List
点击打开链接hdu 1671 题意:给定n个电话号码串,问这n个电话号码串中是否存在某一串是其它串的前缀,如果存在输出NO,否则YES 思路:把这n个电话号码串建立成字典树,在插入的时候我们直接判断当前插入的字符串是不是其它串的前缀或者其...
726 0
|
2月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
170 1
|
19天前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
23天前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法