hdu 1247 Hat’s Words (字典树)

模板题

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<map>
using namespace std;
typedef long long lld;
const int oo=0x3f3f3f3f;
const lld OO=1e18;
const int Mod=1000000007;
const int maxn=50000+5;
const int maxm=16;


struct Trie
{
    struct TrieNode
    {
        int f;
        TrieNode* child[26];
        TrieNode()
        {
            f=0;
            for(int i=0;i<26;i++)
                child[i]=NULL;
        }
    }* root;

    Trie()
    {
        root=new TrieNode();
    }

    bool Search(char str[])
    {
        TrieNode* p=root;
        for(int i=0,k;str[i];i++)
        {
            k=str[i]-'a';
            if(p->child[k])
                p=p->child[k];
            else return false;
        }
        return p->f;
    }

    void Insert(char str[])
    {
        TrieNode* p=root;
        for(int i=0,k;str[i];i++,p=p->child[k])
        {
            k=str[i]-'a';
            if(!p->child[k])
                p->child[k]=new TrieNode();
        }
        p->f=true;
    }

};

char str[maxn][maxm];
char strL[maxm],strR[maxm];

int main()
{
    Trie tree;
    int n=0;
    while(scanf("%s",str[++n])!=EOF)tree.Insert(str[n]);
    for(int i=1;i<=n;i++)
    {
        int len=strlen(str[i]);
        for(int mid=0;mid<len;mid++)
        {
            for(int j=0;j<=mid;j++)
                strL[j]=str[i][j];
            for(int j=mid+1;j<len;j++)
                strR[j-mid-1]=str[i][j];
            strL[mid+1]=strR[len-mid-1]='\0';
            if(tree.Search(strL)&&tree.Search(strR))
            {
                printf("%s\n",str[i]);
                break;
            }
        }
    }
    return 0;
}





你可能感兴趣的:(hdu 1247 Hat’s Words (字典树))