给你一些电话号码,请判断它们是否是一致的,即是否有某个电话是另一个电话的前缀。比如:
Emergency 911
Alice 97 625 999
Bob 91 12 54 26
在这个例子中,我们不可能拨通Bob的电话,因为Emergency的电话是它的前缀,当拨打Bob的电话时会先接通Emergency,所以这些电话号码不是一致的。
输入
第一行是一个整数t,1 ≤ t ≤ 40,表示测试数据的数目。
每个测试样例的第一行是一个整数n,1 ≤ n ≤ 10000,其后n行每行是一个不超过10位的电话号码。
输出
对于每个测试数据,如果是一致的输出“YES”,如果不是输出“NO”。
样例输入
2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
样例输出
NO YES
基本思路:每个节点包括10个儿子指针,每次输入一个号码,从根节点(0处,不代表任何值)开始,找他下一个数值对应的儿子:
如果儿子节点是NULL说明暂时不是任何人的前缀,这个节点的allin标记为false,走到最后一个值,将最后一个节点记为危险节点(如果后续的号码走到这就说明他是人家的前缀);
如果这个儿子节点不是NULL说明之前走过(之前输入的号码),接着走,如果到死都不是NULL,说明是前缀,如果走到一个危险节点,说明之前的某个号码是他的前缀。
代码冗余了一点,发现val位其实是没有作用的,然后也没啥必要用tree[100000],但是我懒得改了(明确)
一遍AC(我未来的老婆就叫一遍AC!)真是太棒了
#include<iostream>
#include<string.h>
#pragma warning (disable:4996)
using namespace std;
struct node
{
node *so