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
Meanwhile, T is different from all the substrings of S. Could you help TIANKENG get the name as soon as possible?
In each test case:
Input a string S. the length of S is not large than 1000000.
Output the string t satisfying the condition.(T also only contains eight kinds of letters-------‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’.)
3 ABCDEFGH AAABAACADAEAFAGAH ACAC
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;
}
199



被折叠的 条评论
为什么被折叠?



