hdu 1247 Hat’s Words
2016-07-26 23:13
281 查看
题意:给你一些字符串,找出哪些字符串是由给的字符串中某两个字符串组成。
解法:字典树,把给的字符串放进字典树,然后枚举每一个字符串,拆分当前字符串,然后到字典树中去找。
解法:字典树,把给的字符串放进字典树,然后枚举每一个字符串,拆分当前字符串,然后到字典树中去找。
#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; }
相关文章推荐
- django 后台 链接图片URL报错
- ruby自动化之selenium webGUI
- 为你的TabBar添加Badge-感谢分享
- 51单片机之外设——74HC138、74HC02、74HC573讲解(一)
- bzoj2152
- 337. House Robber III beats 76.16% 12ms cpp
- 常见JSP中文乱码例子及其解决方法
- linux kernel的中断子系统:GIC代码分析
- HTML 第一天-基础知识
- Ajax(1)
- 常用语法2
- pat 1006 Sign In and Sign Out (25)
- DOM节点操作
- Percona XtraBackup User Manual 阅读笔记
- <source> 各路資源
- lsusb命令
- C语言中的参数不确定
- poj 1584
- java 输入一个字符串,打印出该字符串中字符的所有排列
- WPF版公司的自动签到程序