您的位置:首页 > 其它

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

2017-06-10 22:04 459 查看


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: