4 solutions

  • 1
    @ 2024-11-12 20:23:31
    #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;
    }
    
    
    • @ 2024-11-13 15:42:34

      不用排序也可以做

  • 1
    @ 2024-11-12 20:12:28

    #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; }

    • @ 2024-11-12 20:17:28

      CE代码,没有头文件

    • @ 2024-11-13 11:18:45

      pwmwocnm我还以为你有好题解呢,cnmcnmcnmcnm

    • @ 2024-11-13 15:41:18

      @ 请你把不文明用语删掉,否则封号

  • 0
    @ 2024-11-12 20:13:28
    #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
      @ 2024-11-13 11:18:17
      #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