Hat’s Words HDU - 1247 (字典树)

#include <stdio.h>
#include <cstring>

char str[50002][110];

struct Node
{
    Node *next[26];
    int v;
    Node(){
        v = 0;
        memset(next, 0, sizeof(next));
    }
};

Node *root = new Node;

void Insert(char *s)
{
    Node *p = root;
    int len = strlen(s), id;
    for(int i = 0; i < len; i++)
    {
        id = s[i] - 'a';
        if(p->next[id] == 0)
            p->next[id] = new Node;
        p = p->next[id];
    }
    p->v = 1;    //标记为叶子节点 
}

bool search(char *s)
{
    int len = strlen(s), id;
    Node *p = root;
    for(int i = 0; i < len; i++)
    {
        id = s[i] - 'a';
        if(p->next[id] == 0)
            return false;
        p = p->next[id];
    }
    if(p->v == 1)      //必须要判断是否是叶子节点 
        return true;
    else
        return false;

int main()
{
    char a[100], b[100];
    int cnt = 0;
    while(~scanf("%s", str[cnt]))
    {
        Insert(str[cnt]);
        cnt++;
    }
    for(int i = 0; i < cnt; i++)
    {
        int len = strlen(str[i]); 
        for(int j = 1; j < len; j++)
        {
            memset(a, '\0', sizeof(a));
            memset(b, '\0', sizeof(b));
            strncpy(a, str[i], j);       //将str[i]的前j个字符复制到a中 
            strncpy(b, str[i]+j, len-j);   //将str[i]的后len-j个字符赋值到b中
            if(search(a) && search(b))
            {
                printf("%s\n", str[i]);
                break;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mch2869253130/article/details/82221245