2019上海ICPC B.Prefix Code

https://ac.nowcoder.com/acm/contest/4370/B

簽到題吧 時限給的足足有5s 所以可以直接用stl裏的unordered_map
把每個字符串的前綴塞進去,最後遍歷一下看是不是有某個字符串塞進去了兩次即可
複雜度 t * n * len *log unordered_map本質是哈希表,是可以卡掉的
如果時限給的比較緊,字典樹即可
考慮把每個字符串都插入字典樹 全部插入後,遍歷所有字符串,看過程中的字符是不是存在,以及結尾位置是不是≥2(即存在兩個相同字符串) 複雜度t * n * len

下面給出unordered_map和字典樹版本的代碼

unordered_map:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s[250005];
int main()
{
   ios::sync_with_stdio(0);
   int t;cin>>t;
   int cas=0;
   while(t--){
      int n;cin>>n;
      unordered_map<string,int> mp;
      int flag=0;
      for(int i=0;i<n;i++){
        cin>>s[i];
        int len=s[i].size();
        string c="";
        for(int j=0;j<len;j++){
           c+=s[i][j];
           mp[c]++;
        }
      }
       for(int i=0;i<n;i++) if(mp[s[i]]>=2) {flag=1;break;}
      cout<<"Case #"<<++cas<<": ";
      cout<<(flag?"No":"Yes")<<endl;
      
   }
   return 0;
}

字典樹:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int trie[100005][10];
int val[100005];
char c[10005][15];
int tot;
void insert(int x)
{
    int root=0;
    int len=strlen(c[x]);
    for(int i=0;i<len;i++)
    {
        int id=c[x][i]-'0';
        if(!trie[root][id]) trie[root][id]=++tot;
        root=trie[root][id];
    }
    val[root]++;
}
bool query(int x)
{
    int root=0;
    int len=strlen(c[x]);
    for(int i=0;i<len;i++)
    {
        int id=c[x][i]-'0';
        if(val[root]) return 1;
        root=trie[root][id];
    }
    if(val[root]>=2) return 1;
    return 0;
}
int main()
{
    int cas;
    scanf("%d",&cas);
    for(int tt=1;tt<=cas;tt++)
    {
        tot=0;
        scanf("%d",&n);
        memset(trie,0,sizeof trie);
        memset(val,0,sizeof val);
        for(int i=0;i<n;i++)
        {
            scanf("%s",c[i]);
            insert(i);
        }
        printf("Case #%d: ",tt);
        int flag=0;
        for(int i=0;i<n;i++)
        {
            flag=query(i);
            if(flag) break;
        }
        if(!flag) puts("Yes");
        else puts("No");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章