hdu2846(字典树好题)
来源:互联网 发布:色情光碟在淘宝怎么买 编辑:程序博客网 时间:2024/06/11 21:29
字典树的好题
题意:给你n个串,然后又q次询问,输出n个串中包含改串的个数
思路:这题非常考验个人的分析能力,最初的想法是用AC自动机或者是后缀数组做,但有感觉不可行,最后看了题解才知道要用字典树,对n个串的子串的前缀建立字典树,注意:同一个串可能有相同的子串,所以要有个flag标记。
首先要注意的是串的长度小于20,这个条件很关键,那么它的子串最多有(20+1)*20/2 约等于200个, 用字典树解,建树的时间复杂度是O(2*10^6)
题意:给你n个串,然后又q次询问,输出n个串中包含改串的个数
思路:这题非常考验个人的分析能力,最初的想法是用AC自动机或者是后缀数组做,但有感觉不可行,最后看了题解才知道要用字典树,对n个串的子串的前缀建立字典树,注意:同一个串可能有相同的子串,所以要有个flag标记。
首先要注意的是串的长度小于20,这个条件很关键,那么它的子串最多有(20+1)*20/2 约等于200个, 用字典树解,建树的时间复杂度是O(2*10^6)
查询的时间复杂度为O(2*10^6),总的时间复杂度为O(4*10^6), 1000ms 的时间,不会超时,同时也不会超内存
代码如下:
#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 500000#define inf 0x7ffffff#define eps 1e-9#define pi acos(-1.0)using namespace std;struct node{ int ch[N][26]; int val[N]; int flag[N]; int sz; void init() { memset(ch,0,sizeof(ch)); memset(val,0,sizeof(val)); memset(flag,-1,sizeof(flag)); sz = 1; } void insert(string s,int v) { int i,len = s.length(); int u = 0; for(i = 0; i < len; i++) { int c = s[i] - 'a'; if(ch[u][c] == 0) ch[u][c] = sz++; u = ch[u][c]; } if(flag[u] != v) { //cout<<v<<" "<<s<<endl; val[u]++; flag[u] = v; } } int search(string s) { int i,len = s.length(); int u = 0; for(i = 0; i < len; i++) { int c = s[i] - 'a'; if(!ch[u][c]) return 0; u = ch[u][c]; } return val[u]; }}trie;int main(){// ios::sync_with_stdio(false);//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout); trie.init(); int n,m,i; cin>>n; string str; while(n--) { cin>>str; int len = str.length(); for(i = 0; i < len; i++) for(int j = 1; j < len - i +1; j++){ //cout<<str.substr(i,j)<<endl; trie.insert(str.substr(i,j), n); } } cin>>m; for(i = 1; i <= m; i++) { cin>>str; printf("%d\n",trie.search(str)); } return 0;}
0 0
- hdu2846(字典树好题)
- 字典树(Trie)hdu2846
- HDU2846(字典树变形)
- hdu2846 Repository(字典树)
- hdu2846 Repository 字典树(好题)
- hdu2846(动态字典树||静态字典树 模板)Repository
- hdu2846 Repository (字典树)
- hdu2846 Repository 字典树
- hdu2846 字典树 判子串
- HDU2846 Repository 字典树
- 字典树求子串hdu2846
- hdu2846 Repository (字典树)
- hdu2846 Repository -字典树
- HDU2846【字典树】
- HDU2846 简单字典树
- hdu2846之经典字典树
- hdu2846
- HDU2846
- 记录一些东西防忘
- 暴力搜索---新技能get
- Sqoop详细介绍包括:sqoop命令,原理,流程
- Blog 迁移地址
- Ubuntu系统 的备份和恢复
- hdu2846(字典树好题)
- 【JavaScript】JavaScript使用面向对象的技术创建高级 Web 应用程序
- Findbugs 缺陷详解与英文代号的对照表
- JQuery选择过滤器
- final 关键字的总结
- [水]ZOJ1007
- 算法导论最后一章《近似算法》习题“装箱”问题求解
- Android学习之路
- CentOS 6.3更新源(163的)