hdu 1247 Hat’s Words
来源:互联网 发布:农村淘宝代收点 编辑:程序博客网 时间:2024/06/07 05:44
题意:给你一些字符串,找出哪些字符串是由给的字符串中某两个字符串组成。
解法:字典树,把给的字符串放进字典树,然后枚举每一个字符串,拆分当前字符串,然后到字典树中去找。
#include<bits/stdc++.h>using namespace std;char str[50005][100];struct node{ int cnt; node *next[26]; node() { cnt=0; for(int i=0;i<26;i++) next[i]=NULL; }}*root;void mt(char *s){ node *p=root; int len=strlen(s); for(int i=0;i<len;i++) { int j=s[i]-'a'; if(p->next[j]==NULL) { p->next[j]=new node; p=p->next[j]; } else p=p->next[j]; } p->cnt++;}bool sm(char *ss){ node *p=root; int len=strlen(ss); for(int i=0;i<len;i++) { int j=ss[i]-'a'; if(p->next[j]==NULL) return false; p=p->next[j]; } if(p->cnt) return true;}void dt(node *T){ if(T==NULL) return; for(int i=0;i<26;i++) if(T->next[i]!=NULL) dt(T->next[i]); free(T); return;}int main(){ root=new node; int k=0; while(scanf("%s",str[k])!=EOF) { mt(str[k]); k++; } for(int i=0;i<k;i++) { int len=strlen(str[i]),j; char st[100],sst[100]; for(j=1;j<len;j++) { int v; for(v=0;v<j;v++) sst[v]=str[i][v]; sst[v]='\0'; strncpy(st,str[i]+j,len-j); st[len-j]='\0'; if(sm(sst)&&sm(st)) { printf("%s\n",str[i]); break; } } } dt(root); 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
- Java中的ExceptionInInitializerError异常及解决方法
- 【LoadRunner】Http协议下单点登录的URL重定向问题
- poj 2996 Help Me with the Game
- USACO Cow Travelling 游荡的奶牛
- 数据结构——平衡二叉搜索树的原理及编程实现
- hdu 1247 Hat’s Words
- 用java自带工具javac和java编译运行java程序
- Android 如何判断wifi热点是否需要密码
- 图像旋转算法与实现
- 2016 Multi-University Training Contest 3 1011【鸽巢原理】
- 新手之 Maven环境搭建
- Android Training--SnackBar
- 一个很好的makefile例子(经典)
- Opencv实现两幅图像融合