zoukankan      html  css  js  c++  java
  • 牛客网 4370B (Trie树)

    题目链接:https://ac.nowcoder.com/acm/contest/4370/B

    查询字符集中是否有字符串是另一字符串的前缀
    Trie 树边插入边判断即可
    注意每次把 Trie 树清空

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 1001000;
    
    int T,Case = 0;
    int N, root = 0, cnt = 0;
    
    char str[maxn];
    
    struct Node{
    	int son[10];
    	int mark;
    }trie[maxn];
    
    bool insert(char *s){
    	int pos = root; int flag = 0, pre = cnt;
    	for(int i=0;i<strlen(s);++i){
    		int num = s[i] - '0';
    		if(!trie[pos].son[num]) trie[pos].son[num] = ++cnt;
    		pos = trie[pos].son[num];
    		if(trie[pos].mark) flag = 1;
    	}
    	trie[pos].mark = 1;
    	
    	if(flag || pre == cnt) return false;
    	else return true;
    }
    
    ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
    
    int main(){
    	T = read();
    	while(T--){
    		for(int i=0;i<=cnt;++i){
    			memset(trie[i].son,0,sizeof(trie[i].son));
    			trie[i].mark = 0;
    		}
    		++Case; cnt = 0;
    		int flag = 0;
    		N = read();
    		for(int i=1;i<=N;++i){
    			scanf("%s",str);
    			if(!insert(str)){
    				flag = 1;
    			}
    		}
    		if(!flag){
    			printf("Case #%d: Yes
    ",Case);
    		}else{
    			printf("Case #%d: No
    ",Case);
    		}
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    Redis-数据类型
    文件转二进制流拆分与组装
    word 文件转PDF 预览
    查询数据库还原时间
    Window10主机连接到Docker 中的mysql 数据库
    sqlServer 执行存储过程结果存表中
    启动mysql 镜像
    Java类型转换细节
    IDEA常用插件
    IDEA控制台中文乱码
  • 原文地址:https://www.cnblogs.com/tuchen/p/13885170.html
Copyright © 2011-2022 走看看