首页 > 其他分享 >SPOJ PHONELST - Phone List | UVA11362 Phone List

SPOJ PHONELST - Phone List | UVA11362 Phone List

时间:2022-10-13 13:35:56浏览次数:90  
标签:ch leq int tree List Phone SPOJ 字符串 now

简要题意

\(t\) 组数据,每组数据给定 \(n\) 个长度不超过 \(10\) 的数字串,判断是否有两个字符串 \(A\) 和 \(B\),满足 \(A\) 是 \(B\) 的前缀,若有,输出 NO ,若没有,输出 YES

\(1 \leq t \leq 40,1 \leq n \leq 10000\)

思路

\(O(tn^2)\) 的 Hash 无法通过本题,考虑 Trie。

将 \(n\) 个字符串插入一个 Trie,然后枚举字符串 \(B\),如果存在字符串 \(A\) 是 \(B\) 的前缀,那么在字典树上遍历到 \(B\),中间必定经过 \(A\) 的最后一个字符表示的节点。

最终思路:将 \(n\) 个字符串插入一个 Trie,我们考虑维护一个布尔数组 \(E\),\(E_i\) 表示字典树节点 \(i\) 是否为一个输入的字符串的最后一个字符表示的节点,这个好维护。然后枚举 \(B\),在字典树中 DFS 到 \(B\),判断沿途节点是否存在 \(E_i=\operatorname{true}\) 即可。

时间复杂度 \(O(10nt)\)。

代码

#include <cstring>
#include <iostream>
#define int long long
using namespace std;

int tree[100005][15],tot;
bool endd[100005];
string s[100005];

void insert(string x,int id){
	int now=0;
	for(char ch:x){
		if(!tree[now][ch-'0']){
			tree[now][ch-'0']=(++tot);
		}
		now=tree[now][ch-'0'];
	}
	endd[now]=1;
}

void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		string x;
		cin>>x;
		insert(x,i);
		s[i]=x;
	}
	for(int i=1;i<=n;i++){
		int now=0;
		for(char ch:s[i]){
			if(endd[now]){
				cout<<"NO"<<'\n';
				return;
			}
			if(!tree[now][ch-'0']){
				tree[now][ch-'0']=(++tot);
			}
			now=tree[now][ch-'0'];
		}
	}
	cout<<"YES"<<'\n';
}

signed main(){
	int t;
	cin>>t;
	while(t--){
		memset(tree,0,sizeof(tree));
		memset(endd,0,sizeof(endd));
		tot=0;
		solve();
	}
	return 0;
}

标签:ch,leq,int,tree,List,Phone,SPOJ,字符串,now
From: https://www.cnblogs.com/zheyuanxie/p/spoj-phonelist-uva11362.html

相关文章

  • Java 如何将 List 转换为 MAP
    有时候我们需要将给定的List转换为Map。如果你使用的是Java8以后版本的话,Stream是你的好朋友。Java8publicMap<Integer,Animal>convertListAfterJava8(Lis......
  • 基于Alist和RaiDrive挂载阿里、天翼、123云盘、百度网盘以及对象存储
    背景说明AList是一个支持多种存储,支持网页浏览和WebDAV的文件列表程序。支持视频、音频、文档、PDF、图片预览。易于安装,并且可以在所有平台上使用。AList支持多个......
  • Vue练手项目todoList事件总线写法
    源码仓库地址https://gitee.com/zyqwasd/todo-list-vue运行1.gitclone git@gitee.com:zyqwasd/todo-list-vue.git2.npminstall 3.npmrunserve效果图注......
  • List集合中的某个元素的计算
    XXX为实体类名称getxxx为实体类中需要计算的字段名称  第一种方式intsuma=list.stream().map(e->e.getxxx()).reduce(Integer::sum).get();//求和intmaxa=......
  • Unlock Object list:CR下清单解锁
    有时候挂错了地方乱七八糟的情况都有有时候需要传输的时候,挂了一堆乱七八糟的对象等等。会发现对象被锁,需要解锁SE10​......
  • ListBox的ItemContainerStyle、Template
    <StyleTargetType="ListBox"><SetterProperty="ItemContainerStyle"><Setter.Value><StyleTargetType="ListBoxItem"><S......
  • java 数据结构 ArrayList
    importjava.util.ArrayList;importjava.util.Collections;/***java数据结构ArrayList*importjava.util.ArrayList;//引入ArrayList类*ArrayList<E>objectNa......
  • Java 数据结构 LinkedList
    importjava.util.LinkedList;/***Java数据结构LinkedList*链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点......
  • Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
    概要上一章,我们学习了Collection的架构。这一章开始,我们对Collection的具体实现类进行讲解;首先,讲解List,而List中ArrayList又最为常用。因此,本章我们讲解ArrayList。先对Arra......
  • Unlock Object list:CR下清单解
    有时候挂错了地方乱七八糟的情况都有有时候需要传输的时候,挂了一堆乱七八糟的对象等等。会发现对象被锁,需要解锁SE10​......