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.14】总结

    第一题是几何题,没去想直接弃疗.... 第二题觉得很像背包,但是单挑人的顺序不同,答案也会不同,我比较了每个人先后的优劣性,成功搞定了这道题.但是再输出时不小心搞错了,爆零. 第三题,我答案了整整一个 ...

  2. Static使用

    1.什么是static? static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 其余控制变量存储方式的关键字为auto.register.extern. 2.为什么要引入sta ...

  3. [CF11D]A Simple Task 题解

    题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...

  4. HDU 6656 Kejin Player

    hdu题面 Time limit 5000 ms Memory limit 524288 kB OS Windows 解题思路 因为升级只能一级一级地升,所以所求期望满足了区间加的性质,可以一级一级地 ...

  5. 序列式容器————dequeue

    #include <deque> 双端队列,可以在队头队尾进行入队出队操作 deque<int> q; q.empty(); q.push_front(s);//将s插入到队头 ...

  6. 人工智能之基于Opencv与深度学习的计算机视觉实战课程

    https://www.bilibili.com/video/av66375362 imagewatch:https://blog.csdn.net/iracer/article/details/83 ...

  7. Window7下安装Eclipse C/C++ Developer

    觉得自己写这个是有点脑残的.哈哈. 毕业之后,看的多的是Java.大多忘记C和C++的东西.虽说大学第一门计算机语言就是学的C.惭愧. 重温一下C的知识. 正题: 1.在Windows下安装Eclip ...

  8. B. Array K-Coloring

    B. Array K-Coloring 给定一个数组 要求对元素进行染色,满足相同元素颜色一定不同,且所有颜色要全部用完 #include<bits/stdc++.h> using nam ...

  9. nmon性能监控

    1.nmon下载地址 2../nmon_x86_rhel52 3.根据上面提示的快捷键进行输入即可显示相应的资源耗用情况,如输入:c.m.d(显示cpu.内存.磁盘使用情况) 4.输入数据到文件 ./ ...

  10. android网络连接工具类

    该类的目的主要是判断设备的联网状态  检测设备是否连接了网络 package com.wotlab.home.moneyplantairs.utils; import android.content. ...