HDU 1251

//这题不仅仅只是字符串处理一下那么简单,字典树。。。不然狂超时。。。。。。。。。。。
//字典树的代码,基础字典树
#include "stdio.h"   
#include "string.h"   
#include "stdlib.h"   

struct dictree   
{   
    struct dictree *child[26];   
    int n;   
};   
struct dictree *root;   


void insert (char *source)   
{   
    int len,i,j;
    struct dictree *current,*newnode;   
    len=strlen(source);   
    if(len==0) return;   
    current=root;   
    for(i=0;i<len;i++)   
    {   
        if(current->child[source[i]-'a']!=0)   
        {
            current=current->child[source[i]-'a'];
            current->n=current->n+1; 
        }
        else   
        {   
            newnode=(struct dictree *)malloc(sizeof(struct dictree));   
            for(j=0;j<26;j++)   
                newnode->child[j]=0; 
            current->child[source[i]-'a']=newnode;   
            current=newnode;
            current->n=1;    
        }   
    }   
}   


int find(char *source)   
{   
    int i,len;   
    struct dictree *current;  
    len=strlen(source);
    if(len==0) return 0;   
    current=root;   
    for(i=0;i<len;i++)   
    {   
        if(current->child[source[i]-'a']!=0)   
            current=current->child[source[i]-'a'];   
        else return 0;   
    }   
    return current->n;   
}  


int main()
{
    char temp[11];
    int i,j;
    root=(struct dictree *)malloc(sizeof(struct dictree));  
	
    for(i=0;i<26;i++)   
        root->child[i]=0;

    root->n=2; 
    while(gets(temp),strcmp(temp,"")!=0)
        insert(temp);

    while(scanf("%s",temp)!=EOF)
    {
        i=find(temp);
        printf("%d\n",i);
    }
}


//超时的。。。。。
#include "stdio.h"

const int MAX=9999999;
char words[MAX][12];							//全局变量已初始化
char prefix[12];

int main()
{
	char ch,temp='\0';

	int count=0;						//count代表单词数
	int i=0,j;								//i---字母指针
	while(scanf("%c",&ch)!=EOF)
	{
		if(ch=='\n' && temp=='\n')
			break;

		else if(ch=='\n' && temp!='\n')
		{
			count++;
			i=0;
		}

		else
			words[count][i++]=ch;

		temp=ch;
	}



	//testprint
	//for(i=0;i<count;i++)
		//printf("%s\n",words[i]);

	int sum;
	while(scanf("%s",prefix)!=EOF)
	{
		sum=0;
		for(i=0;i<count;i++)
		{
			for(j=0;prefix[j]!='\0';j++)
				if(words[i][j]!=prefix[j])
					break;

			if(prefix[j]=='\0')
				sum++;
		}

		printf("%d\n",sum);
	}

	return 0;
}


上一篇:C++之:模板元编程(三) 默认模板参数


下一篇:改用C++生成自动化数据表