// I stand with PALESTINE
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("avx,avx2")
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
//using namespace __gnu_pbds;
// #define int long long
#define ff first
#define ss second
#define sz(a) (int) (a).size()
//template<class T, class C = null_type> using ordered_tree = tree<T, C, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long double ld;
namespace io {
template<typename F, typename S>
ostream &operator<<(ostream &os, const pair<F, S> &p) { return os << p.ff << " " << p.ss; }
template<typename F, typename S>
ostream &operator<<(ostream &os, const map<F, S> &mp) {
for (auto it: mp) { os << it << endl; }
return os;
}
template<typename F>
ostream &operator<<(ostream &os, const vector<F> &v) {
bool space = false;
for (F x: v) {
if (space) os << " ";
space = true;
os << x;
}
return os;
}
template<typename F>
ostream &operator<<(ostream &os, const deque<F> &d) {
bool space = false;
for (F x: d) {
if (space) os << " ";
space = true;
os << x;
}
return os;
}
template<typename F>
ostream &operator<<(ostream &os, const set<F> &st) {
bool space = false;
for (F x: st) {
if (space) os << " ";
space = true;
os << x;
}
return os;
}
template<typename F>
ostream &operator<<(ostream &os, const multiset<F> &st) {
bool space = false;
for (F x: st) {
if (space) os << " ";
space = true;
os << x << x;
}
return os;
}
template<typename F, typename S>
istream &operator>>(istream &is, pair<F, S> &p) { return is >> p.ff >> p.ss; }
template<typename F>
istream &operator>>(istream &is, vector<F> &v) {
for (F &x: v) { is >> x; }
return is;
}
long long fastread() {
char c;
long long d = 1, x = 0;
do c = getchar(); while (c == ' ' || c == '\n');
if (c == '-') c = getchar(), d = -1;
while (isdigit(c)) {
x = x * 10 + c - '0';
c = getchar();
}
return d * x;
}
static bool sep = false;
using std::to_string;
string to_string(bool x) {
return (x ? "true" : "false");
}
string to_string(const string &s) { return "\"" + s + "\""; }
string to_string(const char *s) { return "\"" + string(s) + "\""; }
string to_string(const char &c) {
string s;
s += c;
return "\'" + s + "\'";
}
template<typename Type>
string to_string(vector<Type>);
template<typename F, typename S>
string to_string(pair<F, S>);
template<typename Collection>
string to_string(Collection);
template<typename F, typename S>
string to_string(pair<F, S> p) { return "{" + to_string(p.ff) + ", " + to_string(p.ss) + "}"; }
template<typename Type>
string to_string(vector<Type> v) {
bool sep = false;
string s = "[";
for (Type x: v) {
if (sep) s += ", ";
sep = true;
s += to_string(x);
}
s += "]";
return s;
}
template<typename Collection>
string to_string(Collection collection) {
bool sep = false;
string s = "{";
for (auto x: collection) {
if (sep) s += ", ";
sep = true;
s += to_string(x);
}
s += "}";
return s;
}
void print() {
cout << endl;
sep = false;
}
template<typename F, typename... Other>
void print(F ff, Other... other) {
if (sep) cout << " | ";
sep = true;
cout << to_string(ff);
print(other...);
}
}
using namespace io;
namespace utils {
template<typename F, typename S>
inline void maxs(F &a, S b) { a = a > b ? a : b; }
template<typename F, typename S>
inline void mins(F &a, S b) { a = a < b ? a : b; }
template<typename F, typename S>
long long max(F a, S b) { return a > b ? a : b; }
template<typename F, typename S>
long long min(F a, S b) { return a < b ? a : b; }
constexpr long long operator "" _E(unsigned long long n) {
long long p = 1, a = 10;
for (int i = 0; i < n; i++) p *= a;
return p;
}
random_device rd;
mt19937 mt(rd());
template<typename T>
T rand(T l, T r) {
uniform_int_distribution<T> dist(l, r);
return dist(mt);
};
}
using namespace utils;
#ifdef sunnatov
#define print(...) cout << "[" << #__VA_ARGS__ << "]: "; io::print( __VA_ARGS__ );
#else
#define print( ... ) 42
#endif
const int mod = 9_E + 7;
const double EPS = 1e-7;
long long doxuya = 18_E + 10;
int INF = 9_E + 10;
const char nl = '\n';
int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/*
*/
const int N = 5e5;
vector<vector<int>> out(N, vector(26, 0));
vector<int> par(N, -1), cnt(N), mx(N);
vector<bool> ex(N);
int z;
void add(const string &s) {
int x = 0;
cnt[0]++;
for (int i = 0; i < s.size(); i++) {
if (!out[x][s[i] - 'a']) {
out[x][s[i] - 'a'] = ++z;
par[z] = x;
}
x = out[x][s[i] - 'a'];
cnt[x]++;
mx[x] = max(mx[x], sz(s));
}
ex[x] = true;
}
void remove(const string &s) {
int x = 0;
cnt[0]--;
for (int i = 0; i < s.size(); i++) {
x = out[x][s[i] - 'a'];
cnt[x]--;
}
ex[x] = false;
}
void solution(istream &cin, ostream &cout, const int &test_case) {
int n;
cin >> n;
vector<string> s(n);
cin >> s;
for (int i = 0; i < n; i++) add(s[i]);
int x = 0;
vector<char> ans;
string way = "";
while (x != -1) {
if (!cnt[x]) {
x = par[x];
ans.emplace_back('-');
way.pop_back();
continue;
}
if (ex[x]) {
ans.emplace_back('P');
remove(way);
continue;
}
int best = -1;
for (int i = 0; i < 26; i++) {
if (!out[x][i] or !cnt[out[x][i]]) continue;
if (best == -1 or mx[out[x][i]] < mx[out[x][best]]) best = i;
}
x = out[x][best];
ans.emplace_back(best + 'a');
way += best + 'a';
}
while (!ans.empty() and ans.back() == '-') ans.pop_back();
cout << sz(ans) << nl;
for (char x: ans) cout << x << nl;
}
int32_t main() {
clock_t startTime = clock();
cin.tie(0)->sync_with_stdio(false);
srand(time(0));
std::istream &in(std::cin);
std::ostream &out(std::cout);
int32_t queries = 1;
#ifdef test_cases
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
cin >> queries;
#else
// cin >> queries;
#endif
for (int32_t test_case = 1; test_case <= queries; test_case++) {
print(test_case);
solution(cin, cout, test_case);
// cout << nl;
}
#ifdef sunnatov
cout << "Time: " << (int) ((double) (clock() - startTime) / CLOCKS_PER_SEC * 1000) << " ms" << endl;
#endif
return EXIT_SUCCESS;
}
Compilation message
printer.cpp: In function 'constexpr long long int utils::operator""_E(long long unsigned int)':
printer.cpp:186:27: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
186 | for (int i = 0; i < n; i++) p *= a;
| ~~^~~
printer.cpp: In function 'void add(const string&)':
printer.cpp:231:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
231 | for (int i = 0; i < s.size(); i++) {
| ~~^~~~~~~~~~
printer.cpp: In function 'void remove(const string&)':
printer.cpp:246:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
246 | for (int i = 0; i < s.size(); i++) {
| ~~^~~~~~~~~~
printer.cpp: In function 'int32_t main()':
printer.cpp:206:22: warning: statement has no effect [-Wunused-value]
206 | #define print( ... ) 42
| ^~
printer.cpp:307:9: note: in expansion of macro 'print'
307 | print(test_case);
| ^~~~~
printer.cpp:289:13: warning: unused variable 'startTime' [-Wunused-variable]
289 | clock_t startTime = clock();
| ^~~~~~~~~
printer.cpp:293:19: warning: unused variable 'in' [-Wunused-variable]
293 | std::istream &in(std::cin);
| ^~
printer.cpp:294:19: warning: unused variable 'out' [-Wunused-variable]
294 | std::ostream &out(std::cout);
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
72796 KB |
Output is correct |
2 |
Correct |
41 ms |
72796 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
33 ms |
72784 KB |
Output is correct |
2 |
Correct |
33 ms |
72784 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
34 ms |
72860 KB |
Output is correct |
2 |
Correct |
34 ms |
72792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
34 ms |
72728 KB |
Output is correct |
2 |
Correct |
35 ms |
72832 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
72828 KB |
Output is correct |
2 |
Correct |
34 ms |
72836 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
35 ms |
72792 KB |
Output is correct |
2 |
Correct |
35 ms |
73024 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
73056 KB |
Output is correct |
2 |
Correct |
54 ms |
73452 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
73688 KB |
Output is correct |
2 |
Correct |
52 ms |
73556 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
64 ms |
74776 KB |
Output is correct |
2 |
Correct |
87 ms |
76720 KB |
Output is correct |
3 |
Correct |
65 ms |
75844 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
60 ms |
74512 KB |
Output is correct |
2 |
Correct |
95 ms |
77512 KB |
Output is correct |
3 |
Correct |
66 ms |
76236 KB |
Output is correct |
4 |
Correct |
88 ms |
77420 KB |
Output is correct |