TIANKENG’s restaurant(Ⅱ) hdu 4886 思维暴力

本文介绍了一道算法题目,任务是给定一个由特定字符组成的字符串,找出不是该字符串子串的最短且字典序最小的新字符串。文章提供了一个高效的解决方案,并通过样例输入输出展示了解决方案的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TIANKENG’s restaurant(Ⅱ)

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 130107/65536 K (Java/Others)
Total Submission(s): 717    Accepted Submission(s): 257


Problem Description
After improving the marketing strategy, TIANKENG has made a fortune and he is going to step into the status of TuHao. Nevertheless, TIANKENG wants his restaurant to go international, so he decides to name his restaurant in English. For the lack of English skills, TIANKENG turns to CC, an English expert, to help him think of a property name. CC is a algorithm lover other than English, so he gives a long string S to TIANKENG. The string S only contains eight kinds of letters-------‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’. TIANKENG wants his restaurant’s name to be out of ordinary, so the restaurant’s name is a string T which should satisfy the following conditions: The string T should be as short as possible, if there are more than one strings which have the same shortest length, you should choose the string which has the minimum lexicographic order. Could you help TIANKENG get the name as soon as possible?

Meanwhile, T is different from all the substrings of S. Could you help TIANKENG get the name as soon as possible?
 

Input
The first line input file contains an integer T(T<=50) indicating the number of case.
In each test case:
Input a string S. the length of S is not large than 1000000.
 

Output
For each test case:
Output the string t satisfying the condition.(T also only contains eight kinds of letters-------‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’.)
 

Sample Input
3 ABCDEFGH AAABAACADAEAFAGAH ACAC
 

Sample Output
AA BB B

看了数据这么长,以为肯定是某个数据结构。。。。

其实并不是。。。。

题意:给一个串,求不是这个串的子串的字典序最小的那个字符串

其实结果最大长度不会超过7,可以想一下长度小于等于7的字符串就已经有8^7种了(只有A~H八种字符),如果一个串的子串这些都包括了,那这个串必然特别长,会超过1000000(估计法。。),所以就只需要暴力一下串就可以了,map复杂度会高一写,可以使用O1的hash,把字符串当做一个八进制数

为了区别A和AA,不同长度的可以分别考虑

#include<bits/stdc++.h>
using namespace std;
int book[5000005];
int main()
{
    ios::sync_with_stdio(0);
    int T,i,n,j,k;
    cin>>T;
    string s;
    while(T--)
    {
        cin>>s;
        string ans;
        int flog=0;
        for(i=0;i<6;i++)
        {
            memset(book,0,sizeof(book));
            for(j=0;j+i<s.size();j++)
            {
                int now=0;
                for(k=j;k<=j+i;k++)
                {
                    now=now*8+s[k]-'A';
                }
                book[now]=1;
            }
            int up=(int)pow(8,i)*8;
            int len=0;
            for(j=0;j<up;j++)
            {
                if(book[j]==0)
                {
                    while(j)
                    {
                        ans=(char)('A'+j%8)+ans;
                        len++;
                        j/=8;
                    }
                    for(;len<=i;len++)
                        ans='A'+ans;
                    cout<<ans<<endl;
                    flog=1;
                    break;
                }
            }
            if(flog)
                break;
        }
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值