Phone List POJ-3630 字典树 or 暴力

题意

目前有 t 组数据, n 个电话号码,如果拨打号码的时候 先拨通了某个号码,那么这一串号码就无法全部拨通。

举个例子 911 和 9112016652 相比 后者就无法被拨通,因为 911 会先被拨通。

如果都可拨通 输出 YES 不然输出 NO。

解题思路

这里我是对insert函数进行了修改,在插入的过程中进行判断。

具体过程是这样的,flag数组记录两个信息,一是以这个结点结尾是不是一个完整的字符串,如果是那么就赋值为1,如果这个结点不是一个完整的字符串的结尾的话,那么这个结点是不是一个长字符串的中间结点呢?如果是,那么就赋值为-1。如果是0的话,那么说明这个点没有字符串经过,更谈不上是一个字符串的结尾了。这样我们在插入一个新的字符串的时候就要进行判断了,判断什么?判断这个结果的结点是不是前面一个已经插入结点的结尾,如果是的话,那么这个样例就可以结束了,后面的输入也不用再次插入了,节省时间。

另一个方法是进行sort函数对字符串进行排序,这个让我眼前一亮,字符串也可以排序!之后就是进行模拟了。

代码实现

字典树

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
int tree[maxn][11];
int flag[maxn];
int tot;
bool insert(char *str)
{
int len=strlen(str);
int root=0;
for(int i=0; i<len; i++)
{
int id=str[i]-'0';
if(!tree[root][id])
tree[root][id]=++tot;
if(flag[root]==1) //表示这个点是一个完整的数
return false;
if(flag[root]==0) //表示没有经过,也没有完整的数
flag[root]=-1; //表示经过这里
root=tree[root][id];
}
if(flag[root]!=0)
return false;
flag[root]=1;
return true;
}
int main()
{
int t, n, f=1;
char buf[15];
scanf("%d", &t);
while(t--)
{
memset(tree, 0, sizeof(tree));
memset(flag, 0, sizeof(flag));
scanf("%d",&n);
f=1;
tot=0;
while(n--)
{
scanf("%s", buf);
if(f)
{
if(insert(buf)==false)//如果这个号码插入过程中,发现前缀是另一个号码,那么就可以令f=0
f=0;//后续的字符串就不用进行插入了。
}
}
if(f==1)
printf("YES\n");
else printf("NO\n");
}
return 0;
}

暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
string s[100005];
int main()
{
char p[12];
int t,flag=0,n,i,j;
scanf("%d",&t);
while(t--)
{
flag=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",&p);
s[i]=p;
}
sort(s,s+n);
for(int i=1;i<n;i++)
{
cout<<s[i-1]<<endl;
if(s[i].size()>s[i-1].size())//如果当前的字符串比前一个还要短的话,那么当前的字符串肯定不受影响
{
for(j=0;j<s[i-1].size();j++)
if(s[i][j]!=s[i-1][j])
break;
if(j==s[i-1].size())
{
flag=1;
break;
}
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}

Phone List POJ-3630 字典树 or 暴力的更多相关文章

  1. POJ 2418 字典树

    题目链接:http://poj.org/problem?id=2418 题意:给定一堆树的名字,现在问你每一棵树[无重复]的出现的百分比,并按树名的字典序输出 思路:最简单的就是用map来写,关于字典 ...

  2. POJ 2503 字典树

    题目链接:http://poj.org/problem?id=2503 题意:给定一个词典,输入格式为[string1' 'string2]  意思是string2的值为string1. 然后给定一波 ...

  3. poj 3764 字典树

    The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7332   Accepted: 1 ...

  4. POJ 3630 trie树

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...

  5. POJ 2001 字典树(入门题)

    #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #i ...

  6. POJ 2513 字典树+并查集+欧拉路径

    Description: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木 ...

  7. hdu 1671&& poj 3630 (trie 树应用)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25280   Accepted: 7678 Descr ...

  8. HDU 5536 Chip Factory 字典树+贪心

    给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...

  9. HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)

    题意:n个点的一棵树,树的边上有权值.一条路径的权值定义成这条路径上所有边的权值的xor.问所有路径的最大权值是多少. 思路: 首先,树上任意两点之间的路可以表示成 这两点到根节点的路- 其最近公共祖 ...

随机推荐

  1. 【NOIP2016提高A组模拟8.23】函数

    题目 分析 观察这个是式子\(\sum_{d|n}f(n)=n\), 发现其实函数\(f()\)就是欧拉函数\(φ()\)(见http://blog.csdn.net/chen1352/article ...

  2. 《Spring源码深度解析》一

    Spring整体架构 1.1 Spring整体架构 1.1.1 Core Container: 模块:Core.Beans.Context和Expression Language Core:框架的基础 ...

  3. Java设计模式:23种设计模式全面解析(超级详细)

    设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性的解决方案. 1995 ...

  4. 为什么要重写hashcode( )和equals( )?

    打个比方,一个名叫张三的人去住酒店,在前台登记完名字就去了99层100号房间,此时警察来前台找叫张三的这个人住在哪间房,经过查询,该酒店住宿的有50个叫张三的,需要遍历查询,查询起来很不方便. 那么就 ...

  5. ubuntu 7z解压

    安装方法:     sudo apt-get install p7zip 解压文件:     7z x manager.7z -r -o /home/xx 解释如下: x 代表解压缩文件,并且是按原始 ...

  6. protocol buffer第一篇:语法介绍

    先理解一下protocol buffer是什么东西. protocol buffer是google发明的一种数据序列化方案,和json是同种类型的玩意,它非常适合在rpc场景下使用.同json一样,p ...

  7. 网络相关辅助类NetUtils

    package yqw.java.util; import java.net.NetworkInterface;import java.util.ArrayList;import java.util. ...

  8. SQL的积累

    SQL的积累学习(不常用的经常会忘记,所以以后用到的就会记在下面): --新增字段alter table t_Student add Test varchar(200)--删除字段alter tabl ...

  9. Jprofiler远程监控JVM

    一.下载并安装 本地和远程服务器分别安装Jprofiler,下载地址 二.Windows远程连接JVM配置 1.打开Windows客户端Jprofiler 2.点Cancel 3.创建远程会话 4.添 ...

  10. [CSP-S模拟测试]:123567(莫比乌斯函数+杜教筛+数论分块)

    题目传送门(内部题92) 输入格式 一个整数$n$. 输出格式 一个答案$ans$. 样例 样例输入: 样例输出: 数据范围与提示 对于$20\%$的数据,$n\leqslant 10^6$. 对于$ ...