hdu 1247 trie树入门题

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1247

题意:给你一些单词,输出是由两个其他的单词组成的单词。

分析:trie树的入门题,很简单,这题的数据很水,每个单词的长度不会超过26.

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=50005;
char word[N][27];
struct node
{
    bool ok;
    node *next[26];
    node()
    {
        ok=false;
        memset(next,0,sizeof(next));
    }
};
void Insert(node *rt,char *s)
{
    int i=0;
    node *p=rt;
    while(s[i]){
        int k=s[i++]-'a';
        if(p->next[k]==NULL)
            p->next[k]=new node();
        p=p->next[k];
    }
    p->ok=true;
}
bool Search(node *rt,char s[])
{
    int i=0,top=0,sta[27];
    node *p=rt;
    while(s[i]){
        int k=s[i++]-'a';
        if(p->next[k]==NULL)return 0;
        p=p->next[k];
        if(p->ok&&s[i])sta[top++]=i;
    }
    while(top){
        bool flag=1;
        i=sta[--top];
        p=rt;
        while(s[i]){
            int k=s[i++]-'a';
            if(p->next[k]==NULL){
                flag=0;break;
            }
            p=p->next[k];
        }
        if(flag&&p->ok)return true;
    }
    return 0;
}
int main()
{
    int n=0;
    //freopen("f.txt","r",stdin);
    node *rt=new node();
    while(gets(word[n])){
        Insert(rt,word[n]);
        n++;
    }
    for(int i=0;i<n;i++){
        if(Search(rt,word[i]))
            printf("%s\n",word[i]);
    }
    return 0;
}

这题用map的话也可以,每次把一个单词分成两部分,分别用map判断是否两部分存在。时间复杂度n*(单词长度)*n(logn),有点大,但是数据比较弱,随便水水还是可以的。

#include<iostream>
#include<cstdio>
#include<map>
#include<string>
using namespace std;
map<string,bool>a;
string s[50005];
int main()
{
    int t=0;
    //freopen("f.txt","r",stdin);
    while(cin>>s[t]){
        a[s[t]]=true;
        t++;
    }
    for(int i=0;i<t;i++){
        int n=s[i].size();
        for(int j=1;j<n;j++){
            string s1(s[i],0,j);
            string s2(s[i],j);
            if(a[s1]&&a[s2]){
                cout<<s[i]<<endl;break;
            }
        }
    }
    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章