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