zoukankan      html  css  js  c++  java
  • hdu1247

    一道水题,居然改错改了一个多小时

    题目的意思是其实就是找出一个单词,前半部是一个出现过的单词,后半部也是,记住,要严格满足这个条件

    所以,其实也就是先查找一个单词的是否有前缀,再用这个单词除去前缀的部分查找是否存在一个这样的单词

    虽然题目说按字典序输出,但本身已经是按字典序输入了,所以排序也就省了

    #include<iostream>
    #include<string>
    using namespace std;
    struct node
    {
    	int v;
    	node *next[26];
    };
    node *root;
    char str[50002][50];
    void insert(char *s)
    {
    	node *p=root;
    	for(;*s!='\0';s++)
    	{
    		int d=*s-'a';
    		if(p->next[d]==NULL)
    		{
    			p->next[d]=new node();
    			p=p->next[d];
    		}
    		else p=p->next[d];
    	}
    //	cout<<p->v<<endl;
    	p->v=1;
    }
    int find2(char *s)
    {
    	node *p=root;
    	for(;*s!='\0';)
    	{
    		int d=*s-'a';
    		if(p->next[d]!=NULL)
    		{
    	    	p=p->next[d];
    		    if(p->v==1&&*(s+1)=='\0')//这部分很关键,要严格满足
    			  return 1;
    			s++;//这里也是,即使上一步没找到,还得继续往下查找
    		}
    		else return 0;
    	}
    	return 0;
    }
    int find(char *s)
    {
    	node *p=root;
    	for(;*s!='\0';)
    	{
    		int d=*s-'a';
    		p=p->next[d];
    		if(p!=NULL)
    		{ 
    		if(p->v==1&&find2(s+1))//用除去前缀剩下的部分在find2中查找
    		    	return 1;
    		s++;
    		}
    		else return 0;
    	}
    	return 0;
    }
    
    int main()
    {
    	int i=0,j;
    	root=new node();
    	while(scanf("%s",str[i])!=EOF)
    	{
    	   insert(str[i]);
    	   i++;
    	}
    	for(j=0;j<i;j++)
    	{
    		
    		if(find(str[j]))
    		{ 
    			cout<<str[j]<<endl;;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    插入排序Java实现
    WMI控制IIS(2)
    WMI控制IIS
    C语言中用qsort()快速排序
    list_for_each引起的问题
    c++数组地址
    Valgrind 使用简单说明检查内存泄露
    firefox 在UBUNTU下编译
    内存泄漏检测umdh
    ubuntu GIT 安装与使用
  • 原文地址:https://www.cnblogs.com/nanke/p/2046869.html
Copyright © 2011-2022 走看看