4 solutions
-
1
#include<bits/stdc++.h> #define int long long using namespace std; int tot=1,trie[1000005][10],flag[1000005];//一定要开够大,trie的空间复杂度为10(平均长度)*10(字符个数)*10000(项目数量)=1e6+6 string s1[1000050]; bool cmp(string x,string y){ return x.length()<y.length(); } signed main() { ios::sync_with_stdio(0); //解绑 cin.tie(0); cout.tie(0); int t; cin >> t; while(t--){ int n; cin >> n; memset(trie,0,sizeof trie); //初始化两个数组 memset(flag,0,sizeof flag); for (int i=1;i<=n;i++){ cin >> s1[i]; } sort(s1+1,s1+n+1,cmp); //将字符串先排序,将短的放在前面 for (int i=1;i<=n;i++){ //以保证后面串的前缀一定能被找到 string s=s1[i]; int u=1,f=0; for(char ch:s){ if (!trie[u][ch-'0']){ trie[u][ch-'0']=++tot; } u=trie[u][ch-'0']; if (flag[u]){ //便插入边判断 cout << "NO\n"; f=1; //直接退出 break; } } flag[u]=1; if(f)break; if (i==n && !f){ //当前是最后一个串且找不到对应前缀,不存在 cout << "YES\n"; break; } } } return 0; }
-
1
#include #include #include #define N 100005 using namespace std; int t[N][256]; int word[N]; int tot=0,f=0; void insert(string s) { int u=0; for(int i=0;i<s.size();i++) { if(!t[u][s[i]]) t[u][s[i]]=++tot; u=t[u][s[i]]; } word[u]++; } void find(string s) { int u=0; for(int i=0;i<s.size();i++) { if(word[u]) { f=1; return; } if(!t[u][s[i]]) return; u=t[u][s[i]]; } } string p[10000]; int main() { int k; cin>>k; while(k--) { memset(t,0,sizeof t); memset(word,0,sizeof word); tot=0,f=0; int n; cin>>n; for(int i=0;i<n;i++) { cin>>p[i]; insert(p[i]); } for(int i=0;i<n;i++) { find(p[i]); if(f) break; } if(f) cout<<"NO\n"; else cout<<"YES\n"; } return 0; }
-
0
#include<iostream> #include<string> #include<cstring> #define N 100005 using namespace std; int t[N][256]; int word[N]; int tot=0,f=0; void insert(string s) { int u=0; for(int i=0;i<s.size();i++) { if(!t[u][s[i]]) t[u][s[i]]=++tot; u=t[u][s[i]]; } word[u]++; } void find(string s) { int u=0; for(int i=0;i<s.size();i++) { if(word[u]) { f=1; return; } if(!t[u][s[i]]) return; u=t[u][s[i]]; } } string p[10000]; int main() { int k; cin>>k; while(k--) { memset(t,0,sizeof t); memset(word,0,sizeof word); tot=0,f=0; int n; cin>>n; for(int i=0;i<n;i++) { cin>>p[i]; insert(p[i]); } for(int i=0;i<n;i++) { find(p[i]); if(f) break; } if(f) cout<<"NO\n"; else cout<<"YES\n"; } return 0; }
-
-2
#include<bits/stdc++.h> using namespace std; string g[10005]; int tire[1000005][10]; int w[1000005]; int tot; void ins(string k){ int u=0; int sz=k.size(); for(int i=0;i<sz;i++){ int a=k[i]-'0'; if(tire[u][a]==0){ tot++; tire[u][a]=tot; } u=tire[u][a]; } w[u]++; } bool find(string k){ int u=0; int sz=k.size(); for(int i=0;i<sz;i++){ int a=k[i]-'0'; if(tire[u][a]==0){ return false; } u=tire[u][a]; } return true; } bool cmp(string a,string b){ return a.size()>b.size(); } int main(){ int t; cin>>t; for(int i=1;i<=t;i++){ memset(tire,0,sizeof(tire)); memset(w,0,sizeof(w)); tot=0; int n; cin>>n; for(int j=1;j<=n;j++){ cin>>g[j]; } sort(g+1,g+n+1,cmp); bool f=0; for(int j=1;j<=n;j++){ if(find(g[j])){ f=1; cout<<"NO"<<endl; break; } ins(g[j]); } if(f==0){ cout<<"YES"<<endl; } } }
- 1
Information
- ID
- 51
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 8
- Tags
- # Submissions
- 73
- Accepted
- 12
- Uploaded By