hdu 1247 Hat’s Words

现在感觉好简单。。
不过半个月前写的时候tel 了一下午。。
问题并不是出在字典树(看了模板谁都会好不好)

我看了discuss,有人说是好题。。 确实是入门好题(好像没资格说诶)

在查找的时候,我一开始用On2 暴力找,就是在2个find,找到前半部分符合就继续找后半部分。。 果断爆炸。。
discuss 里面看了一下,他先尝试确定了 前缀和后缀,然后把这两个test进行判断。。真是机智(我太蠢)

另外。给大家推荐一首好听的,适合这个季节的日文歌: 春に残る雪..

下面是代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
set<string>s;
struct trie
{
    int v;
    trie *next[26];
    trie()
    {
        v=0;
        for(int i=0;i<26;i++)
        {
            next[i]=NULL;
        }
    }
};
int lens[50010];
trie root;
int cnt;
void build(char *str)
{
    int len=strlen(str);
    lens[cnt]=len;
    trie *p=&root;
    for(int i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(p->next[id]==NULL)
        {
            trie *q=new trie;
            p->next[id]=q;
        }
        p=p->next[id];
    }
    p->v=1;
}
int find(char *str)
{
    int len=strlen(str);
    trie *p=&root;
    for(int i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(p->next[id]==NULL)
        {
            return 0;
        }
        p=p->next[id];
    }
    return p->v;
}
char word[50010][100];
int main()
{
    cnt=0;
    while(cin.getline(word[cnt],100))
    {
        build(word[cnt]);
        cnt++;
    }
    s.clear();
    for(int i=0;i<cnt;i++)
    {
        for(int j=1;j<lens[i];j++)
        {
            char ch=word[i][j];
            word[i][j]='\0';
            int flag1=0;
            if(find(word[i]))
            {
                flag1++;
            }
            word[i][j]=ch;
            ch=word[i][j-1];
            int flag2=0;
            if(find(word[i]+j))
            {
                flag2++;
            }
            word[i][j-1]=ch;
            if(flag1&&flag2)
            {
                s.insert(word[i]);
            }
        }
    }
    for(set<string>::iterator it=s.begin();it!=s.end();it++)
    {
        cout<<*it<<endl;
    }
    return 0;
}

你可能感兴趣的:(HDU,字典树)