链接:
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中的子串全部存入setfor (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和queues.clear();while (!q.empty()) {q.pop();}}return 0;
}