bzoj-2251 外星联络
2015-07-25 08:47
323 查看
题意:
给出一个字符串,求出现次数超过1的子串的出现个数;
字符串长度<=3000;
题解:
题目问的是子串的个数,那么首先我们要找到所有的子串;
而字符串的所有后缀的前缀可以不重不漏的表示所有子串;
那么如果将所有的后缀加入trie树,每个经过的结点——也就是这个后缀的前缀——计数+1;
然后题目要求按字典序输出,利用一下trie树性质搞好就完了;
指针版trie好慢啊。。。
代码:
给出一个字符串,求出现次数超过1的子串的出现个数;
字符串长度<=3000;
题解:
题目问的是子串的个数,那么首先我们要找到所有的子串;
而字符串的所有后缀的前缀可以不重不漏的表示所有子串;
那么如果将所有的后缀加入trie树,每个经过的结点——也就是这个后缀的前缀——计数+1;
然后题目要求按字典序输出,利用一下trie树性质搞好就完了;
指针版trie好慢啊。。。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #define N 3100 using namespace std; struct trie { int cnt; trie *next[2]; trie() { next[0]=next[1]=NULL; cnt=0; } }*root=new trie(); char str ; void insert(char *s) { bool index; trie *p=root; while(*s!='\0') { index=*s-'0'; if(p->next[index]==NULL) p->next[index]=new trie(); p=p->next[index]; p->cnt++; s++; } } void dfs(trie *p) { if(p->cnt>1) printf("%d\n",p->cnt); if(p->next[0]!=NULL) dfs(p->next[0]); if(p->next[1]!=NULL) dfs(p->next[1]); } int main() { int n,m,i,j,k; scanf("%d%s",&n,str+1); for(i=1;i<=n;i++) insert(str+i); dfs(root); return 0; }
相关文章推荐
- linux初学(二)之文件的基本架构
- hdu 1544 统计回文子串的个数
- 骑士的移动
- linux初学(一)之命令行bash的基本操作
- HDU5290树形DP一颗树扔炸弹几次能炸完
- hdoj 1234开门人和关门人
- C# KeyDown KeyPress KeyUp 处理相应的键盘事件
- java 产生的固体物的基础上 增删改的SQL声明
- 编程工作报告模板
- Oracle connect by 树查询之二
- 暑假NOIP笔记—搜索
- Win10统一应用商店将在7月29日开业 开发者将会收到最终版本的Win10
- linux mkfs命令参数及用法详解---linux格式化文件系统命令(包括swap分区)
- [Domino]如何用java远程访问Domino邮箱数据
- 1060. Are They Equal (25)
- 工作日志2014-08-27
- 消息系统Kafka介绍
- NSString以及NSArray的习题练习
- 快快快!27个提升效率的iOS开源库推荐
- SI编程器