• UVa 10391 Compound Words 字符串hash


    Problem E: Compound Words

    You are to find all the two-word compound words in a dictionary. A two-word compound word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.

    Input

    Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 120,000 words.

    Output

    Your output should contain all the compound words, one per line, in alphabetical order.

    Sample Input

    a
    alien
    born
    less
    lien
    never
    nevertheless
    new
    newborn
    the
    zebra
    

    Sample Output

    alien
    newborn
    ---------------


    ---------------

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    const int maxn=32111;
    const int maxm=11000019;
    
    int head[maxm];
    int next[maxm];
    char word[maxn][30];
    
    int hash(char *p,int prime=10000019)
    {
        unsigned int h=0,g;
        for (;*p;++p){
            h=(h<<4)+*p;
            if (g=h&0xf0000000){
                h=h^(g>>24);
                h=h^g;
            }
        }
        return h%prime;
    }
    
    void addhash(int s)
    {
        int h=hash(word[s]);
        next[s]=head[h];
        head[h]=s;
    }
    
    bool searchstr(char* str)
    {
        int h=hash(str);
        for (int i=head[h];i!=-1;i=next[i])
        {
            if (strcmp(str,word[i])==0) return true;
        }
        return false;
    }
    
    int main()
    {
        char str[30];
        int n=1;
        memset(head,-1,sizeof(head));
        while (gets(word[n]))
        {
            addhash(n);
            n++;
        }
        for (int i=1;i<n;i++)
        {
            for (int j=1;j<strlen(word[i]);j++)
            {
                strcpy(str,word[i]);
                str[j]='\0';
                if (searchstr(str)&&searchstr(word[i]+j))
                {
                    puts(word[i]);
                    break;
                }
            }
        }
        return 0;
    }
    





  • 相关阅读:
    浏览器能正常访问的url,superagent不能正常访问
    Reactor模式理解
    牛客网剑指offer 二维数组的查找
    在C语言结构体中添加成员函数
    html页面字体相关
    html页面背景设定相关
    快速排序
    html页面边框的另一种写法
    2018暑期北航软件能力培养师资培训有感
    web.xml文件介绍
  • 原文地址:https://www.cnblogs.com/cyendra/p/3226304.html
Copyright © 2020-2023  润新知