HDU:2846-Repository
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2846 
Repository 
Time Limit: 2000/1000 MS (Java/Others) 
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
When you go shopping, you can search in repository for avalible merchandises by the computers and internet. First you give the search system a name about something, then the system responds with the results. Now you are given a lot merchandise names in repository and some queries, and required to simulate the process.
Input
There is only one case. First there is an integer P (1<=P<=10000)representing the number of the merchanidse names in the repository. The next P lines each contain a string (it’s length isn’t beyond 20,and all the letters are lowercase).Then there is an integer Q(1<=Q<=100000) representing the number of the queries. The next Q lines each contains a string(the same limitation as foregoing descriptions) as the searching condition.
Output
For each query, you just output the number of the merchandises, whose names contain the search string as their substrings.
Sample Input
20 
ad 
ae 
af 
ag 
ah 
ai 
aj 
ak 
al 
ads 
add 
ade 
adf 
adg 
adh 
adi 
adj 
adk 
adl 
aes 
5 
b 
a 
d 
ad 
s
Sample Output
0 
20 
11 
11 
2
解题心得:
- 都知道字典树就是用来查前缀的,但是这个题它询问的字符串在多少个前面给出的字符串中出现过,不仅仅是在前缀中,刚开始使用KMP怼了一波,TLE,然后还是字典树,思想很暴力也很朴实,用给出的串的每一个后缀来建树
- 例如其中一个串是abbbc,那么在建树的时候要将abbbc,bbbc,bbc,bc,c分别插入树中,但是为了防止一个串被重复计算,例如abab,要将字符串插入的时候做好标记,如果是一个串那么就不用重复加了。
 
 - HDU上提交的时候交C++,G++会MLE,黑人问号。
 
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e5+100;
struct trie
{
    int sum,num;
    trie *child[26];
    trie()
    {
        sum = num = 0;
        for(int i=0;i<26;i++)
            child[i] = NULL;
    }
};
trie *newnode,*current;
trie *root = new trie;
char s[30];
void insert_tree(int p,int num)//第num个串从第p个字符开始的后缀建树
{
    int len = strlen(s);
    current = root;
    for(int i=p;i<len;i++)
    {
        int k = s[i] - 'a';
        if(current->child[k] == NULL)
        {
            newnode = new trie;
            newnode->sum = 1;
            newnode->num = num;
            current->child[k] = newnode;
            current = newnode;
        }
        else
        {
            current = current->child[k];
            if(current->num != num)//如果标记相同说明是同一个串分开的,就不用再加了
            {
                current->num = num;
                (current->sum)++;
            }
        }
    }
}
int query()
{
    current = root;
    int len = strlen(s);
    for(int i=0;i<len;i++)
    {
        int k = s[i] - 'a';
        if(current->child[k] == NULL)
            return 0;
        current = current->child[k];
    }
    return current->sum;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s);
        int len = strlen(s);
        for(int j=0;j<len;j++)
            insert_tree(j,i);
    }
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",s);
        int ans = query();
        printf("%d\n",ans);
    }
    return 0;
}												
											HDU:2846-Repository的更多相关文章
- hdu 2846 Repository
		
http://acm.hdu.edu.cn/showproblem.php?pid=2846 Repository Time Limit: 2000/1000 MS (Java/Others) ...
 - C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
		
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
 - C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
		
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
 - DDD领域驱动设计初探(二):仓储Repository(上)
		
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
 - DDD领域驱动设计初探(三):仓储Repository(下)
		
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
 - HDU 2846 Repository (字典树 后缀建树)
		
Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
 - HDU 2846 Repository(字典树,每个子串建树,*s的使用)
		
Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
 - hdu(2846)Repository
		
Problem Description When you go shopping, you can search in repository for avalible merchandises by ...
 - hdu 2846 Repository (字典树)
		
RepositoryTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
 
随机推荐
- UVALive 4261——Trip Planning——————【dp+打印路径】
			
Trip Planning Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
 - 小程序的switch组件
			
小程序的switch开关组件,总结下大概有三种使用场景. 其一: 纯展示场景, 用来展示某个开关值是打开还是关闭的,这个场景比较简单,给个disabled属性就ok了: 其二: 用户点击后立即切换开关 ...
 - B/S模式获取客户端IP地址
			
using System.Web; namespace Common { public class IPUtil { /// <summary> /// 获取IP地址 /// </s ...
 - [Environment Build] 工作中遇到的关于Git的问题
			
修改已经提交的commit中的author, commit git commit --amend --author 'Your Name <Your Email>' git commit ...
 - SpringBoot2.0之三 优雅整合Spring Data JPA
			
在我们的实际开发的过程中,无论多复杂的业务逻辑到达持久层都回归到了"增删改查"的基本操作,可能会存在关联多张表的复杂sql,但是对于单表的"增删改查"也是不 ...
 - UEditor百度编辑器
			
第一步:首先下载ueditor编译器,地址:http://ueditor.baidu.com/website/ 下载完解压之后就这个: 第二步:我会把文件名utf-8-jsp这个文件名改为uedito ...
 - 链接文字<a>保持原有的字体颜色
			
<style type="text/css"> #red {color: red;} #blue {color: blue;} #orange {color: oran ...
 - PHP中XML和数组互相转换的方法
			
转换代码如下 //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=&g ...
 - android-上下文菜单的创建 - 随心
			
//Menu设置//覆盖两个方法onCreateOptionsMenu(Menu menu).onOptionsItemSelected(MenuItem Item)//onCreateOptions ...
 - php编译安装过程中遇到问题
			
编译安装PHP时遇到的问题 问题1: configure: error: xml2-config not found. Please check your libxml2 installation. ...