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
- hdu 1247 Hat’s Words
- hdu 1247 Hat's words
- hdu 1247 Hat’s Words
- HDU 1247 - Hat’s Words
- hdu 1247 Hat’s Words
- hdu 1247 Hat’s Words
- hdu 1247 Hat’s Words
- hdu 1247 Hat’s Words
- hdu 1247 Hat’s Words
- HDU 1247 Hat’s Words
- hdu 1247 Hat's Words
- hdu-1247 Hat’s Words
- HDU 1247 Hat’s Words
- HDU 1247 Hat’s Words
- hdu Hat's Words(1247)
- HDU 1247 Hat’s Words
- HDU 1247 Hat’s Words
- hdu 1247 Hat’s Words
- ZOJ-3162-To Go or Not to Go
- H.264官方软件JM源代码简单分析-编码器lencod
- LightOJ 1047 - Neighbor House (dp)
- VS 2015 使用经验
- 第十一周项目1 - 二叉树算法验证(3)中序线索化二叉树的算法验证
- hdu 1247 Hat’s Words
- ping命令使用及返回总结
- 牛客网 | 链表中环的入口结点
- 表达树构造
- java swing 设置文件保存路径
- 深度学习(1) 关于图像卷积和卷积神经网络(CNN)
- 给AFNetWorking添加http表头
- nyoj 722
- C---仓储管理系统实现(嵌套链表or二维链表)