zoukankan      html  css  js  c++  java
  • HDU2846 Repository 字典树

    Repository

                                                                                                               Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
                                                                                                                                     Total Submission(s): 961    Accepted Submission(s): 313


    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
      子串,听到这个就头麻,确实这个问题比较纠结,YY通过转换成数字来相除,徒劳啊。。。
    暴力方法是将所给长为N单词拆成N个单词,然后就是基本的查找的,这里要注意的就是将同一个单词中重复的部分忽略掉。利用结构题中的新增变量来记录一个节点上一次覆盖的单词。
       代码如下:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct Node
    {
    	int flag;
    	int pos;
    	struct Node *child[26];
    }Node;
    
    Node *init(  )
    {
    	Node *n= ( Node * )malloc( sizeof( Node ) );
    	n-> flag= 0;
    	n-> pos= -1;
    	memset( n-> child, NULL, sizeof( n-> child ) );
    	return n;
    }
    
    void insert( Node *p, char *in, int pos )
    {
    	if( *in== '\0' )
    	{
    		return;
    	}
    	else
    	{
    		if( p-> child[ *in- 'a' ]== NULL )
    		{
    			p-> child[ *in- 'a' ]= init(  );
    		}
    		if( p-> child[ *in- 'a' ]-> pos!= pos )
    		{
    		    p-> child[ *in- 'a' ]->flag++;
    		}
    		p-> child[ *in- 'a' ]-> pos= pos;
    		insert( p-> child[ *in- 'a' ], in+ 1, pos );
    	}
    }
    
    int search( Node *p, char *in )
    {
    	if( *in== '\0' )
    	{
    		if( p-> flag )
    		{
    			return p-> flag; 
    		}
    		else
    		{
    			return 0;
    		}
    	}
    	else
    	{
    		if( p-> child[ *in- 'a' ]== NULL )
    		{
    			return 0;
    		}
    		search( p-> child[ *in- 'a' ], in+ 1 );
    	}
    }
    
    int main(  )
    {
    	int p, q, len;	char in[25];	Node *n= init(  );
    	scanf( "%d", &p );
    	while( p-- )
    	{
    		scanf( "%s", in );
    		len= strlen( in ); 
    		for( int i= 0; i< len; ++i )
    		{
    			insert( n, in+ i, p );
    		}
    	}
    	scanf( "%d", &q );
    	while( q-- )
    	{
    		scanf( "%s", in );
    		printf( "%d\n", search( n, in ) );
    	}
    }
    
  • 相关阅读:
    用C++发邮件
    python打包程序py2exe实战
    分享:Python: 数据分析资源
    Socket传输文件时进行校验(简单解决TCP粘包问题)
    第二回 基类的架造方法应该为子类想的多一些
    第一回 要想知道为什么抽象出基类,应该先对基类有一个比较明确的认识
    树型结构~无限级联下拉列表框
    为什么我要将数据库上下文进行抽象,为它生产一个基类有用吗~目录
    将不确定变为确定~真的是SqlDataReader引起的超时?
    张学友 《她来听我的演唱会》
  • 原文地址:https://www.cnblogs.com/Lyush/p/2105558.html
Copyright © 2011-2022 走看看