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 ) );
    	}
    }
    
  • 相关阅读:
    Python升级3.6 强力Django+Xadmin打造在线教育平台
    第六模块:WEB框架开发 第1章·Django框架开发1~50
    阿里云主机(ECS)与CentOS7实战
    Django入门与实战
    第五模块:WEB开发基础 第2章·JavaScript基础
    第五模块:WEB开发基础 第1章·HTML&CSS基础
    第四模块:网络编程进阶&数据库开发 第2章·MySQL数据库开发
    阿里云ECS云服务器CentOS7.4下安装MySQL5.7.13、JDK1.7.80、Mycat1.6.5、Redis3.2.10、Nginx1.14.0以及Tomcat7.0.72
    《百词斩·象形9000》第一册(上) 符号Symbol 1
    第三模块:面向对象&网络编程基础 第2章 网络编程
  • 原文地址:https://www.cnblogs.com/Lyush/p/2105558.html
Copyright © 2011-2022 走看看