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 ) );
    	}
    }
    
  • 相关阅读:
    记一次 css样式的使用
    Vue -- element
    Ubuntu系统 ,鼠标双击搜索框内容 ,内容会被自动删除
    MetInfo Password Reset Poisoning By Host Header Attack
    wechall writeup
    SQL常用语句
    PHP Tips
    PHP版本差异备忘录
    Docker入门
    JetBrains系列软件用法
  • 原文地址:https://www.cnblogs.com/Lyush/p/2105558.html
Copyright © 2011-2022 走看看