• hdu 1075 What Are You Talking About(字典树)


    刚学的字典树,代码写得很不熟练。写法上也没有什么特别的优化,就是以1A为第一目标!

    可惜还是失败了。

    少考虑了一种情况,就是一个单词是另一个单词前缀的问题,写了好久,还是没有1A。不过感觉对字典树有了更深刻的理解。

    代码写得不好,看看别人都是怎么写字典树的去。

    #include<stdio.h>
    #include<string.h>
    #include<malloc.h>
    struct node
    {
    	node *a[27];
    	char s[15];
    };
    char s1[15],s2[15];
    char s[3005],ss[15];
    int k;
    node *root;
    void InsertTree()
    {
    	node *cur;
    	node *s;
    	int i,ln;
    	ln=strlen(s2);
    	cur=root;
    	for(i=0;i<ln;i++)
    	{
    		if(i==ln-1)
    		{
    			if(cur->a[s2[i]-'a']!=NULL)
    			{
    				strcpy(cur->a[s2[i]-'a']->s,s1);
    				return ;
    			}
    			else
    			{
    				s=(node *)malloc(sizeof(node));
    				memset(s->a,0,sizeof(s->a));
    				s->s[0]='';
    				cur->a[s2[i]-'a']=s;
    				strcpy(s->s,s1);
    			}
    		}
    		else if(cur->a[s2[i]-'a']!=NULL)
    			cur=cur->a[s2[i]-'a'];
    		else
    		{
    			s=(node *)malloc(sizeof(node));
    			memset(s->a,0,sizeof(s->a));
    			s->s[0]='';
    			cur->a[s2[i]-'a']=s;
    			cur=s;
    		}
    	}
    	return ;
    }
    int FindTree()
    {
    	int i,ln;
    	node *cur;
    	cur=root;
    	ln=strlen(ss);
    	for(i=0;i<ln;i++)
    	{
    		if(i==ln-1)
    		{
    			if(cur->a[ss[i]-'a']!=NULL&&cur->a[ss[i]-'a']->s[0]!='')
    			{
    				printf("%s",cur->a[ss[i]-'a']->s);
    				return 1;
    			}
    			else
    				return 0;
    		}
    		else
    		{
    			if(cur->a[ss[i]-'a']!=NULL)
    				cur=cur->a[ss[i]-'a'];
    			else
    				return 0;
    		}
    	}
    	return 0;
    }
    int main()
    {
    	root=(node *)malloc(sizeof(node));
    	memset(root->a,0,sizeof(root->a));
    	while(scanf("%s",s1))
    	{
    		if(strcmp(s1,"START")==0)
    			continue;
    		else if(strcmp(s1,"END")==0)
    			break;
    		scanf("%s",s2);
    		InsertTree();
    	}
    	getchar();
    	while(gets(s))
    	{
    		if(strcmp(s,"START")==0)
    			continue;
    		else if(strcmp(s,"END")==0)
    			break;
    		int i;
    		k=0;
    		for(i=0;s[i]!='';i++)
    		{
    			if(s[i]>='a'&&s[i]<='z')
    			{
    				ss[k++]=s[i];
    				continue;
    			}
    			else if(k!=0)
    			{
    				ss[k]='';
    				if(!FindTree())
    					printf("%s",ss);
    				memset(ss,0,sizeof(ss));
    				k=0;
    			}
    			printf("%c",s[i]);
    		}
    		if(k!=0)
    		{
    			ss[k]='';
    			if(!FindTree())
    				printf("%s",ss);
    		}
    		printf("
    ");
    	}	
    	return 0;
    }


  • 相关阅读:
    异常
    JAVA Math类
    Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结
    JAVA之JDBC数据库连接池总结篇
    利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等
    python3 最基本且简单的实现组合设计模式
    原生工程接入Flutter实现混编
    a[i][j] 和 a[j][i] 有什么区别?
    iconv函数报错 Detected an illegal character in input string
    用Python把20年的GDP、人口以及房价数据进行了可视化
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3199002.html
Copyright © 2020-2023  润新知