字典树 (The 2019 ICPC Shanghai)

B Prefix Code

传送门

字典树:高效处理字符串;

#include<bits/stdc++.h>
using namespace std;
 
const int N = 1e5+7;  // 树节点个数
 
int tree[N][11],cnt;
bool vis[N];
 
bool add( char *s )
{
    int len=strlen(s) , now=0;
    bool flag=0;
    for( int i=0;i<len;i++ )
    {
        int x=s[i]-'0';
        if( i==len-1 && tree[now][x] ) flag=1; // s串之前出现过 
        
        if( !tree[now][x] ) tree[now][x]=++cnt;
        now=tree[now][x];
        
        if( vis[now] ) flag=1; // S串的子串之前出现过 
    }
    vis[now]=1;
    return flag;
}
 
int main()
{
    int T,kk =1;
    cin>>T;
    while( T-- )
    {   
		cnt=0;
        int n,flag=0;
        scanf("%d",&n);
        memset(tree,0,sizeof tree);
        memset(vis,0,sizeof vis);
        char s[11];
        for( int i=0;i<n;i++ ){
            scanf("%s",s);
            if(add(s)) flag=1;  // 建树 + 查找 
        }
        if(flag) printf("Case #%d: No\n",kk++) ;
		else printf("Case #%d: Yes\n",kk++) ;
    }
    return 0;
}

使用unordered_map<string,int> 对字符串计数:

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;

const int N = 1e5+7;
 
int main()
{
    int t;
    cin>>t;
    for(int k=1;k<=t;k++){
        int n;
        int flag = 1;
        scanf("%d",&n);
        unordered_map<string,int> mp;
        char s[10010][15];
        for(int j=0;j<n;j++){
            scanf("%s",s[j]);
            int len = strlen(s[j]);
            string ss = "";
            for(int i=0;i<len;i++){
                ss+=s[j][i];
                mp[ss]++;
            }
        }
        for(int i=0;i<n;i++){
            if(mp[s[i]]>1){
                flag=0;break;
            }
        }
        if(flag) printf("Case #%d: Yes\n",k);
        else printf("Case #%d: No\n",k);
    }
    return 0;
 }
发布了31 篇原创文章 · 获赞 2 · 访问量 1458

猜你喜欢

转载自blog.csdn.net/weixin_44851176/article/details/104396714
今日推荐