hdu 1247 Hat’s Words

来源:互联网 发布:数据库实用教程答案 编辑:程序博客网 时间:2024/06/06 03:14

题目链接:hdu 1247 Hat’s Words

题意:输入很多单词,然你输出那些可以由这些单词拼接并且在这些单词内的单词

解析:建立字典树,到单词尾部则标记为1,并把所有单词存在一个数组中,然后开始查找,从第一个单词开始找,若在该单词中间碰到末尾标记1,则表示该字串也在这些单词中出现,只要查询该单词的后半部分是否在这些单词中出现,若出现,则说明这个单词可以由其他单词拼接而成。

#include<iostream>#include<cstdio>#include<cstring>#define maxn 55555using namespace std;struct node{    int f;    node *next[26];    node()    {        f=0;        memset(next,0,sizeof(next));    }};node *root=new node();void Insert(string str){    node *p=root;    for(int i=0;i<str.size();i++)    {        int id = str[i]-'a';        if(p->next[id]==NULL) p->next[id]=new node();        p=p->next[id];    }    p->f=1;//每个单词的末尾标记为1}int Find(string s){    node *p = root;    for(int i=0;i<s.size();i++)    {        int id = s[i]-'a';        if(p->next[id]==NULL) return 0;        p=p->next[id];    }    return p->f;}int query(string s){    node * p=root;    for(int i=0;i<s.size();i++)    {        int id = s[i]-'a';        p=p->next[id];        if(p->f&&Find(s.substr(i+1))) return 1;//当在一个单词中找到一个子串的末尾时,查找剩余部分是否出现过,若出现,则这个单词就是这些子串拼接而成的    }    return 0;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    string str[maxn];    string s;    int cnt = 0;    while(cin>>s)    {       str[cnt++]=s;       Insert(s);    }    for(int i=0;i<cnt;i++) if(query(str[i])) cout<<str[i]<<endl;    //fclose(stdin);    //fclose(stdout);    return 0;}




0 0
原创粉丝点击