列表

详情


NC50327. Phone List

描述

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

输入描述

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

输出描述

对于每组数据,若存在两个数字串S,T,使得S是T的前缀,则输出NO,否则输出YES。
请注意此处结果与输出的对应关系!

示例1

输入:

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

输出:

NO
YES

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 102ms, 内存消耗: 14584K, 提交时间: 2020-07-27 22:02:07

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,n,tr[150001][21],tot,len;
bool flag,ok[150001];
char str[51];
void ins()
{
	int u=0,flaag=1;
	for(int i=0;i<len;i++)
	{
		int num=str[i]-'0';
		if(!tr[u][num])
		{
			flaag=0;
			tr[u][num]=++tot;
		}
		u=tr[u][num];
		if(ok[u]) flag=1;
	}
	ok[u]=1;
	if(flaag) flag=1;
	return;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		memset(tr,0,sizeof(tr));
		memset(ok,0,sizeof(ok));
		flag=0;
		tot=0;
		for(int i=1;i<=n;i++)
		{
			cin>>str;
			len=strlen(str);
			ins();
		}
		if(flag) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

C++ 解法, 执行用时: 49ms, 内存消耗: 4388K, 提交时间: 2022-02-04 08:45:50

#include<bits/stdc++.h>
using namespace std;
char a[11];
int trie[100001][10],cnt;
bool f[100001];
bool add(){
	bool flag = 1;
	int len = strlen(a),rt = 0,*p;
	for (int i = 0;i < len;i++){
		p = &trie[rt][a[i] - '0'];
		if (!*p){
			*p = ++cnt;
			flag = 0;
		}
		if (f[*p])return 1;
		rt = *p;
	}
	f[rt] = 1;
	return flag;
}
int main(){
	int n,t;
	bool flag;
	cin>>t;
	while (t--){
		memset(f,0,sizeof(f));
		memset(trie,0,sizeof(trie));
		cnt = 0;
		flag = 0;
		cin>>n;
		while (n--){
			cin>>a;
			flag |= add();
		}
		cout<<(flag ? "NO\n" : "YES\n");
	} 
	return 0;
}

上一题