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

题意:

一个字符串有许多子串  现要找出最短的字典序最小的不是它的子串的串  这个长串只有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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值