链接:
https://codeforces.com/problemset/problem/1536/B
题意:
本题大概题意就是,找一个没出现过的最短的,最小字典序的子串。
input
3 28 qaabzwsxedcrfvtgbyhnujmiklop 13 cleanairactbd 10 aannttoonn
output
ac f b
我们可以用set先存入字符串a中所有的子串,然后用bfs,遍历所有的字符串,从小到大找还未存入set的子串。
代码如下:
#include<iostream>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
queue<string>q;
set<string>s;
string ans;
void bfs() {
string x;
q.push(x);
while (!q.empty()) {
string top = q.front();
q.pop();
if (s.find(top) == s.end()&&top.size()) {//如果在set里未找到该子串且该字符串不是空字符串
ans = top;
return;
}
for (int i = 0; i < 26; i++) {
string temp = top + char('a' + i);
q.push(temp);
}
}
return;
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
string a;
cin >> a;
//将所有a中的子串全部存入set
for (int i = 0; i < a.size(); i++) {
string temp = a.substr(i);
string b;
for (int j = 0; j < temp.size(); j++) {
b = b + temp[j];
s.insert(b);
}
}
bfs();//bfs遍历所有子串,找未出现过的子串
cout << ans;
cout << endl;
//注意最后要清空set和queue
s.clear();
while (!q.empty()) {
q.pop();
}
}
return 0;
}