1077 Kuchiguse

时间:2020-04-14
本文章向大家介绍1077 Kuchiguse,主要包括1077 Kuchiguse使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

link

常规写法:

#include <iostream>
#include <vector>
#include <cstring>
#include <stack>
#include <unordered_set>
#include <queue>
#include <cmath>
#define LL long long
using namespace std;

int main(){
    int N;
    cin>>N;
    getchar();
    string s;
    getline(cin,s);
    int prop=s.size();
    for(int i=2;i<=N;i++){
        string s1;
        getline(cin,s1);
        prop=min(prop,(int)s1.size());
        for(int len=prop;len>=0;len--){
            if(s.substr(s.size()-len,len)==s1.substr(s1.size()-len,len)){
                prop=len; 
                break;
            }
        }
    }
    if(prop>0) cout<<s.substr(s.size()-prop,prop);
    else cout<<"nai";
    return 0;
}

用Trie:

#include <iostream>
#include <vector>
#include <cstring>
#include <stack>
#include <unordered_set>
#include <queue>
#include <cmath>
#include <unordered_map>
#include <algorithm>
#define LL long long
using namespace std;

struct Trie{
    unordered_map<char,Trie*> children;
};
Trie* root;

void buildTrie(string s){
    Trie* cur=root;
    for(char c:s){
        if(cur->children.find(c)==cur->children.end()){
            cur->children[c]=new Trie();
        }
        cur=cur->children[c];
    }
}

int main(){
    int N;
    cin>>N;
    getchar();
    string s;
    root=new Trie();
    for(int i=1;i<=N;i++){
        getline(cin,s);
        reverse(s.begin(),s.end());
        buildTrie(s);
    }
    int res=0;
    Trie* cur=root;
    while(true){
        if(cur->children.size()!=1) break;
        res++;
        auto iter=cur->children.begin();
        cur=iter->second;
    }
    if(res==0) printf("nai");
    else {
        reverse(s.begin(),s.end());
        cout<<s.substr(s.size()-res,res);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/FEIIEF/p/12700076.html