计蒜客习题:糟糕的 Bug


问题描述

蒜头君作为蒜厂的工程师,在开发网站时不小心写出了一个 Bug:当用户输入密码时,如果既和自己的密码一致,也同时是另一个用户密码的 前缀 时,用户会跳转到 404 页。
然而蒜头君坚称:我们的用户那么少,怎么可能触发这个 Bug……
机智的你,能不能帮蒜头君确认一下这个 Bug 到底会不会触发呢?
输入格式
第一行输入一个整数 n(1≤n≤233333),表示蒜厂网站的用户数。接下来一共 n 行,每行一个由小写字母a-z组成的字符串,长度不超过 10,表示每个用户的密码。蒜厂的数据库容量太小,所有密码长度加起来小于 466666。
输出格式
如果触发了 Bug 则输出一行Bug!,否则输出一行Good Luck!。
样例输入
3
abc
abcdef
cdef
样例输出
Bug!


AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=470000;
const int MAX_C=36;
struct Trie{
    int *ch[MAXN];
    int cnt [MAXN];
    int tot;

    void init(){
        tot=0;
        memset(cnt,0,sizeof(cnt));
        memset(ch,0,sizeof(ch));
    }

    void insert(char *str){
        int p=0;
        for(int i=0;str[i];++i){
            if(ch[p]==NULL){
                ch[p]=new int[MAX_C];
                memset(ch[p],-1,sizeof(int)*MAX_C);
            }
            if(ch[p][str[i]-'a']==-1)ch[p][str[i]-'a']=++tot;
            p=ch[p][str[i]-'a'];
        }
        cnt[p]++;
    }

    void find(char *str){
        int p=0;
        for(int i=0;str[i];++i){
            if(cnt[p]!=0){
            cout<<"Bug!";
            exit(0);
            }
            p=ch[p][str[i]-'a'];
        }
        return; 
    }
}trie;

int main(){
    int ans=0;
    int n;
    cin>>n;
    char s[n][15];
    trie.init();
    for(int i=0;i<n;i++){
        scanf("%s",s[i]);
        trie.insert(s[i]);
    }
    for(int i=0;i<n;i++){
        trie.find(s[i]);
    }
    cout<<"Good Luck!"; 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liukairui/article/details/80626895