HDU4886 TIANKENG’s restaurant(Ⅱ)(哈希)

来源:互联网 发布:php7不支持mysql 编辑:程序博客网 时间:2024/06/05 04:31

题意:

一个字符串有许多子串  现要找出最短的字典序最小的不是它的子串的串  这个长串只有A~H字母

分析:

首先估计下答案的最长长度,如果答案的长度为7,那么字符串种类就有8^7种,已经超过了所给字符串的最大长度1000000。那么只需要枚举长度  利用哈希判定字符串出现的问题

#include<bits/stdc++.h>using namespace std;const int maxn = 1000010;char str[maxn];int Hash[maxn], vis[maxn];int main(){    int T, i, j, len;    scanf("%d", &T);    while(T--)    {        scanf("%s", str+1);        len = strlen(str+1);        memset(Hash, 0, sizeof(Hash));        memset(vis, 0, sizeof(vis));        int lim = 8, ans;        for(i = 1; i <= 7; i++)        {            for(j = len; j >= i; j--)            {                Hash[j] = Hash[j-1]*8 + str[j] - 'A';                vis[Hash[j]]++;            }            for(j = 0; j < lim; j++)            {                if(!vis[j])                {                    ans = j;                    goto gt;                }                vis[j] = 0;            }            lim *= 8;        }    gt:        j = 0;        while(i--)        {            str[j++] = ans % 8 + 'A';            ans /= 8;        }        for(i = j - 1; i >= 0; i--)            printf("%c", str[i]);        puts("");    }    return 0;}


原创粉丝点击