• wikioi 1051哈希表


    给出了N个单词,已经按长度排好了序。假设某单词i是某单词j的前缀,i->j算一次接龙(两个同样的单词不能算接龙)。

    你的任务是:对于输入的单词,找出最长的龙。

    第一行为N(1<=N<=105)。下面N行每行一个单词(由小写组成),已经按长度排序。(每一个单词长度<50)

    仅一个数,为最长的龙的长度。

    5

    i

    a

    int

    able

    inter

    3

    1<=N<=105



    思路:这题就是要用到哈希函数匹配字符串是否接龙,可是在处理上感觉比較机智的是栈的应用上,由于这题刚開始我也没太懂,所以费了100积分下载了别人
    的代码,研究了好久才明确。在二维字符串数组排序上,对sort函数又加深了认识,不能直接来排序,二维数组在sort中不能够直接放入排序的。栈又把时间提
    高了好多,达到了线性条件。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include<iostream>
    using namespace std;
    struct node
    {
        int len;
        char a[55];
    }e[100005];
    int Stack[100005];
    bool operator < (node b,node c)
    {
        for(int i=0;i<c.len&&i<b.len;i++)
        {
            if(b.a[i]<c.a[i]) return true;
            else if(b.a[i]>c.a[i]) return false;
        }
        return b.len<c.len;
    }
    int hash(char *s,int len)
    {
        int  sum=0;
        for(int i=0;i<len;i++)
            sum=sum*26+s[i]-'a';
        return sum;
    }
    int main()
    {
        int n,i,sum=0,top=0;
        cin>>n;
        for(i=1; i<=n; i++)
        {
            scanf("%s",e[i].a);
            e[i].len=strlen(e[i].a);
        }
        sort(e+1,e+n+1);
        for(i=1;i<=n;i++)
        {
            while((top)&&e[i].len<=e[Stack[top]].len||hash(e[Stack[top]].a,e[Stack[top]].len)!=hash(e[i].a,e[Stack[top]].len))
                top--;
            Stack[++top]=i;
            if(sum<top) sum=top;
            //cout<<sum<<' '<<top<<' '<<i<<endl;
        }
        cout<<sum<<endl;
        return 0;
    }
    


  • 相关阅读:
    设计模式之建造者模式(简单)
    设计模式之简单工厂模式,工厂模式,抽象工厂模式
    设计模式之观察者模式
    Redis java操作客服端——jedis
    Redis基础
    java环境变量配置加maven配置
    设计模式之JDK动态代理
    springboot+mybatis+Thymeleaf
    OS问题管理系统开发
    复制CentOS虚拟机网络配置
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4231782.html
Copyright © 2020-2023  润新知