Submission #236872

#TimeUsernameProblemLanguageResultExecution timeMemory
236872DanShadersLozinke (COCI17_lozinke)C++17
100 / 100
227 ms3064 KiB
#pragma GCC optimize("O3") #pragma GCC target("sse,sse2,ssse3,sse4.1,sse4.2,avx,avx2") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define all(x) begin(x), end(x) #define x first #define y second typedef long long ll; typedef long double ld; template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template<typename T> using normal_queue = priority_queue<T, vector<T>, greater<T>>; vector<string> strs; vector<pair<string, int>> data_; signed main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; ++i) { string s; cin >> s; strs.push_back(s); } sort(all(strs)); for (int i = 0; i < n; ) { int st = i; while (i < n && strs[i] == strs[st]) ++i; data_.push_back({strs[st], i - st}); } int64_t ans = 0; for (auto g : data_) { string s = g.x; int sz = (int) s.size(); set<string> ss; for (int j = 0; j < sz; ++j) for (int h = 1; h <= sz - j; ++h) ss.insert(s.substr(j, h)); for (string t : ss) { auto q = lower_bound(all(data_), pair<string, int>{t, -1}); if (q != data_.end() && q->x == t) ans += q->y * g.y; } } cout << ans - n << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...