首页 > 其他分享 > PHONELST - Phone List

PHONELST - Phone List

时间:2023-06-12 19:45:20浏览次数:29  
标签:end int List len Phone trie PHONELST include true

PHONELST - Phone List

题面翻译

【题目来源】

Poj3630

【问题描述】

给定n个长度不超过10的数字串,问其中是否存在两个数字串S,T,使得S是T的前缀。有多组数据,数据组数不超过40。n<=10000。

【输入格式】

第一行,一个整数T,表示数据组数。
对于每组数据,第一行一个数n,接下去n行,输入n个数字串。

【输出格式】

对于每组数据,若存在两个数字串S,T,使得S是T的前缀,则输出“NO”,否则输出“YES”。

【数据规模】

n<=10000

题目描述

Phone List

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:

  • Emergency 911
  • Alice 97 625 999
  • 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.

输入格式

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.

输出格式

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

样例 #1

样例输入 #1

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

样例输出 #1

NO
YES

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

int t, n;

struct String {
	char a[11];
	int len;
};

struct Trie {
	int trie[57000][10], tot = 1;
	int end[57000];
	inline void Clear() {
		memset(trie, 0, sizeof(trie));
		memset(end, false, sizeof(end));
	}
	inline bool Insert(char *str) {
		int len = strlen(str), p = 1;
		for (int i = 0; i < len; ++ i) {
			int ch = str[i] - '0';
			if (trie[p][ch] == 0) {
				trie[p][ch] = ++ tot;
			}
			if (end[p] == true) return true;
			//因为是从小到大排序
			//所以小的字符串已经先前被处理完
			//可以在插入得时候进行判断,是否存在先前在路径结尾 
			p = trie[p][ch];
		}
		if (end[p] == true) return true;
		end[p] = true;
		return false;
	}
}tree;

inline bool cmp(const String &a, const String &b) {
	return a.len < b.len;
}

int main() {
	scanf("%d", &t);
	while (t --) {
		scanf("%d", &n);
		String s[10004];
		tree.Clear();
		for (int i = 1; i <= n; ++ i) {
			scanf("%s", s[i].a + 1);
			s[i].len = strlen(s[i].a + 1);
		}
		//从小往大排序 
		stable_sort(s + 1, s + 1 + n, cmp);
		bool flag = false;
		for (int i = 1; i <= n; ++ i) {
			flag = tree.Insert(s[i].a + 1);
			if (flag == true) {
				break;
			}
		}
		if (flag == true) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

标签:end,int,List,len,Phone,trie,PHONELST,include,true
From: https://www.cnblogs.com/jueqingfeng/p/17475952.html

相关文章

  • Java中List集合的subList方法
        一、说明publicList<E>subList(intfromIndex,inttoIndex){...}作用:返回包含从索引fromIndex(包括)到索引toIndex(不包括)元素的List集合。 二、测试下面是关于subList的一些测试。首先,创建一个ArrayList对象,并添加一些元素。然后用subList方法获取一个新的集合。......
  • addEventListener
    addEventListener是给一个DOM元素添加事件监听器的方法,可以在元素上绑定响应函数以便在特定事件发生时被调用。addEventListener的最后一个参数是一个布尔值,用来指定事件监听器应该以哪种方式处理。具体来说,这个参数有两种取值:true,表示在捕获阶段调用事件监听器。当事件发......
  • JavaStream LIst转map
    publicstaticvoidmain(String[]args){List<TarKoc>tarKocs=newArrayList<>();tarKocs.add(newTarKoc().setId(1).setKName("aaa"));tarKocs.add(newTarKoc().setId(2).setKName("bb"));t......
  • 关于map/list集合 和 json串的相互转换
    JSON.parse(tempWhiteBoardTextBook);//将接收到的服务器字符串转为JavaScript对象;JSON.stringify(tempWhiteBoardTextBook);//将JavaScript对象或值转换为JSON字符串,一般是发送json数据到服务器; 1、使用此net.sf.json.JSONObject包将map/list集合或者json串转......
  • listeners和v-model
    <template> <divid="app">  <LoadingButton@click="handlesClick"></LoadingButton>  <ceShi2></ceShi2> </div></template><script>importLoadingButtonfrom'@/compone......
  • Java中 List的遍历及三种遍历方法
    JavaList遍历方法及其效率对比packagecom.zbalpha.test;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassListTest{publicstaticvoidmain(Stringargs[]){List<Long>lists=newArrayList<Long&g......
  • List 接口及其常用方法
    List接口的特点List接口是Collection接口的子接口,其主要特点如下:List中元素有序,是按照元素的插入顺序进行排序的。每个元素都有一个与之关联的整数型索引(索引从0开始),可以根据索引来访问和操作元素,可以使用普通for循环遍历。List中可以包含重复的元素。publicclassLis......
  • Java8新特性Stream之list转map及问题解决
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap具体用法实例如下://声明一个List集合Listlist=newArrayList();list.add(newPerson("1001","小A"));list.add(newPerson("1002","小B"));list.add(......
  • iPhone两秒出图,目前已知的最快移动端Stable Diffusion模型来了
    前言 近日,Snap研究院推出最新高性能StableDiffusion模型,通过对网络结构、训练流程、损失函数全方位进行优化,在iPhone14Pro上实现2秒出图(512x512),且比SD-v1.5取得更好的CLIPscore。这是目前已知最快的端上StableDiffusion模型!本文转载自机器之心仅用于学术分享......
  • phonegap3.1.0自学笔记01_命令行界面(CLI)简单使用
    要使用phonegap的CLI必须首先安装好phonegap,phonegap的安装还请参看我的另外一篇文章:windows7搭建phonegap3Android开发环境。本篇文章介绍CLI的简单使用,由于本人水平有限,还请大侠不要拍砖。 phonegap3.1.0使用命令行去创建应用程序的框架,然后我们可以基于命令行创建的程序再去进......