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 ) );
    	}
    }
    
  • 相关阅读:
    iOS学习6:CoreGraphics简单绘图
    什么是GCD
    iOS对象序列化
    Swift中基本类型的转换
    DataTable转List
    .Net Mvc Automated Migration 数据迁移
    .Net WebApi基本操作
    Sql Server日期时间格式转换
    jquery ajax POST 例子详解
    发布.net mvc遇到的HTTP错误 403.14Forbidden解决办法
  • 原文地址:https://www.cnblogs.com/Lyush/p/2105558.html
Copyright © 2011-2022 走看看