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 ) );
    	}
    }
    
  • 相关阅读:
    扩展问题
    oracle数据类型及其隐式转换 (摘,转载)
    oralce中to_char默认转换格式的理解
    oracle的to_char中的fm(转,摘录)
    Oracle中TO_DATE TO_CHAR格式(转,摘录)
    ZT Abstract Factory
    ZT Factory Pattern
    Singleton
    几本电子书比较
    名词后变为复数+s,或者+es等怎么读
  • 原文地址:https://www.cnblogs.com/Lyush/p/2105558.html
Copyright © 2011-2022 走看看