NC50327. Phone List
描述
输入描述
第一行一个整数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; }