HDU1671-Phone List

Phone List

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5229    Accepted Submission(s): 1769


Problem Description
Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogue listed these numbers:
1. Emergency 911
2. Alice 97 625 999
3. Bob 91 12 54 26
In this case, it’s not possible to call Bob, because the central would direct your call to the emergency line as soon as you had dialled the first three digits of Bob’s phone number. So this list would not be consistent.
 

Input
The first line of input gives a single integer, 1 <= t <= 40, the number of test cases. Each test case starts with n, the number of phone numbers, on a separate line, 1 <= n <= 10000. Then follows n lines with one unique phone number on each line. A phone number is a sequence of at most ten digits.
 

Output
For each test case, output “YES” if the list is consistent, or “NO” otherwise.
 

Sample Input
   
   
2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
 

Sample Output
   
   
NO YES
 
思路1:把所有输入的关键字都存起来,把某个关键字的结尾都存储一个单词结尾标志,然后再一个个查询单词,如果查到某个结尾并不是最后一个结点,则说明有前缀发生.
 
 
思路2:果字符串X=X1X2....Xn是字符串Y=Y1Y2....Ym的前缀,有在插入的时候有两种情况:
X在Y之前插入,X在Y之后插入。
(1)如果Xn在Yn之前插入,那么在插入Yn的时候必然经过Xn的路径,此时可以根据判断在这条路径上是否已经有结点被标记已经构成完成的字符串序列来判断是否存在Yn的前缀;
(2)如果Xn在Yn之后插入,那么插入的过程中必然不需要新申请空间。
 
PS:做这道题目的时候刚开始想是把所有的字符串先存起来,然后在插入的时候给根节点弄个特殊的标记,然后在一个个查找,如果某个字符串查找到结尾时发现结尾不是根节点,
则有重复前缀发生,然后想了一下,如果是长的先插入,短的后插入的话,根节点会弄错,所以又进行了一下排序,然后就一直超内存了!!!
我想着每次都要申请root节点,多麻烦啊,于是就在大循环外面申请了一个root,结果内存爆超啊,想不明白!
还好最后想明白了,原来每一轮运行,由于之前申请的内存没有释放,所以会有累加,于是把根节点放在了循环里面申请,又在末尾部分写了个释放函数,结果就AC了!
 

第二种思路写的

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct telnumber
{
    struct telnumber *child[10];
    bool isroot;
};
struct telnumber *root;
void initial(struct telnumber *node)
{
    int i;
    for(i=0;i<10;i++)
        node->child[i]=NULL;
    node->isroot=0;
}
void freedom(struct telnumber *p)
{
 int i;
 for(i=0;i<10;i++)
  if(p->child[i]!=NULL) freedom(p->child[i]);
 free(p);
}
bool insert(char *source)
{
    int i,len;
 bool preinsert,postinsert; 
    struct telnumber *curent,*newnode;
 preinsert=postinsert=0;
 len=strlen(source);
 curent=root;
    for(i=0;i<len;i++)
    {
        if(curent->child[source[i]-'0']!=NULL)
        {
            curent=curent->child[source[i]-'0'];
    if(curent->isroot==1) preinsert=1;
        }
        else//如果前缀在后面插入,则没有新节点申请
        {
            newnode=(struct telnumber *)malloc(sizeof(struct telnumber));
            initial(newnode);
            curent->child[source[i]-'0']=newnode;
            curent=newnode;
    postinsert=1;//表示申请过新节点,第二种情况不可能发生了
        }
    }
    curent->isroot=1;
  if(preinsert||!postinsert) return 0;//返回0表示有前缀发生
  else return 1;//无前缀发生
}
int main()
{
    int T,n,i;
  bool flag;
  char table[12];
  scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
   root=(struct telnumber *)malloc(sizeof(struct telnumber));
   initial(root);
        for(i=0,flag=1;i<n;i++)
        {
            scanf("%s",table);
    if(insert(table)==0) flag=0;
        }
        if(flag==1) printf("YES\n");
        else printf("NO\n");
   freedom(root);
    }
    return 0;
}


 
内容概要:本文详细介绍了软考高项(高级信息系统项目管理师)的备考策略、考试内容及应试技巧。首先,文章强调了二八法则的应用,即80%的时间精力应放在项目管理领域的核心知识点上,如五大过程组、十大知识域等,20%的时间放在IT知识和组织级项目管理上。备考分为三个阶段:基础阶段通过精读教材、绘制思维导图夯实基础;强化阶段通过真题训练、案例分析提升实战能力;冲刺阶段通过论文押题、模拟考试做好最后准备。文章还特别指出,计算题和论文写作是考试的重点和难点,需重点练习。此外,针对不同地区的考生,提供了差异化的备考建议,如一线城市侧重新技术应用,中西部地区关注乡村振兴信息化等。最后,文章提醒考生关注机考模拟系统的开放时间和准考证打印时间,确保顺利参加考试。 适合人群:准备参加软考高项考试的考生,特别是有一定项目管理基础并希望系统复习、提高应试能力的考生。 使用场景及目标:①帮助考生高效利用有限时间,集中精力复习核心知识点;②通过模拟练习和真题训练,提升计算题和论文写作的能力;③结合实际案例,掌握项目管理全流程知识,提高考试通过率。 其他说明:备考过程中,考生应结合自身实际情况,灵活调整学习计划。同时,充分利用各种学习资源,如精讲课视频、直播课、历年真题等,不断巩固和深化对知识点的理解。考试改革后,机考成为主流,考生需提前熟悉机考系统,确保考试时能够熟练操作。
内容概要:本文详细介绍了利用Simulink构建四台永磁同步电机(PMSM)偏差耦合同步控制系统的方法及其优化策略。首先阐述了多电机同步控制在工业自动化中的重要性和应用场景,如AGV小车底盘驱动、传送带协同等。接着深入探讨了偏差耦合控制的具体实现方式,包括环形耦合结构的设计、耦合补偿算法以及PID参数调整方法。文中特别强调了耦合系数的选择对于系统稳定性的影响,并提供了具体的MATLAB函数用于计算各电机之间的耦合补偿量。此外,还讨论了如何通过动态权重分配算法来增强相邻电机间的耦合关系,从而提高同步速度。同时,针对可能出现的问题提出了预防措施,如避免使用微分环节、设置合理的摩擦系数和采样周期等。最后分享了一些实践经验,例如采用在线参数辨识技术和低通滤波器以应对负载突变等情况。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是那些对多电机同步控制感兴趣的读者。 使用场景及目标:适用于需要精确控制多个电机同步运行的场合,如生产线上多轴协调动作、机器人关节控制等。主要目的是确保各个电机能够按照预定的速度平稳地协同工作,减少由于不同步造成的故障风险。 其他说明:文章不仅提供了理论指导,还包括了许多实用的操作技巧和注意事项,有助于读者更好地理解和掌握这一复杂的控制技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值