zoukankan      html  css  js  c++  java
  • hdu1251

    并查集告一段落啦,先放下吧,今晚再做一下总结吧

    之后转入字典树的学习

    这道题目是比较基础的而且明显的字典树

    慢慢来吧

    题意比较明显,查找以某一个串为前缀的单词的数目,字典树还有一个名称,就是前缀树,所以就很明显了吧

    不过下面的代码用的是比较朴素的方法,root->next[],开的内存太大了,不过速度也相对快了

    root->cnt记录的是以从根节点到达该节点组成的串为前缀的单词的个数

    此题涉及到字典树的俩个基本操作,插入还有查找,代码很容易理解

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    typedef struct node
    {
    	int cnt;
    	struct node *next[26];
    }*tree,t;
    tree root;
    void insert(char *str)
    {
    	tree p=root,newnode;
    	for(;*str!='\0';str++)
    	{
    		if(p->next[*str-'a']!=NULL)
    		{
    			p=p->next[*str-'a'];
    			p->cnt++;
    		}
    		else 
    		{
    			newnode=(tree)malloc(sizeof(t));
    		  for(int i=0;i<26;i++)
    		    newnode->next[i]=NULL;
    	      newnode->cnt=1;
    		  p->next[*str-'a']=newnode;
    		  p=newnode;
    		}
    	}
    }
    int find(char *str)
    {
    	tree p=root;
    	for(;*str!='\0';str++)
    	{
    		if(p->next[*str-'a']!=NULL)
    		p=p->next[*str-'a'];
    		else return 0;
    	}
    	return p->cnt;
    }
    int main()
    {
    	char str[16];
    	root=(tree)malloc(sizeof(t));
    	for(int i=0;i<26;i++)
    		root->next[i]=NULL;
    	root->cnt=0;//根节点初始化当然为0,不包含任何字母
    	while(gets(str))
    	{
    		if(strcmp(str,"")==0)
    			break;
    		insert(str);
    	}
    	while(gets(str))
    	{
    		//if(strcmp(str,"")==0)
    			//break;
    		printf("%d\n",find(str));
    	}
    	return 0;
    }
    
  • 相关阅读:
    SQL2008-显示表大小行数
    SQL2008-备份SQL数据库的语句
    SQL2008-截取字段函数
    SQL2008-字符转数字CAST和CONVERT
    SQL2008-查询库中是否存在某表
    SQLServer 2000个人版下载
    SQL2008-不同数据库之间的触发器
    SQL2008--行号的得到
    Microsoft Visual Stduio 2005 Ent安装报错解决方法
    zlib快速编译脚本
  • 原文地址:https://www.cnblogs.com/nanke/p/2044316.html
Copyright © 2011-2022 走看看