# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1077352 | komasan | Lozinke (COCI17_lozinke) | C++14 | 275 ms | 17508 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define pb push_back
#define ll long long
#define el '\n'
const int maxn = 2e4 + 5;
const ll base = 31;
int n, strSz[maxn];
string s;
ll H[maxn][15][2], mods[2], pw[2][15];
pair<ll, ll> get(int id, int l, int r) {
pair<ll, ll> res;
res.F = (H[id][r][0] - H[id][l - 1][0] * pw[0][r - l + 1] + mods[0] * mods[0]) % mods[0];
res.S = (H[id][r][1] - H[id][l - 1][1] * pw[1][r - l + 1] + mods[1] * mods[1]) % mods[1];
return res;
}
void preprocess() {
mods[0] = 1e9 + 10777, mods[1] = 1e9 + 19777;
for (int j = 0; j < 2; ++j) {
pw[j][0] = 1;
for (int i = 1; i <= 10; ++i)
pw[j][i] = pw[j][i - 1] * base % mods[j];
}
for (int t = 1; t <= n; ++t) {
cin >> s;
int sz = s.size(); strSz[t] = sz; s = ' ' + s;
for (int j = 0; j < 2; ++j)
for (int i = 1; i <= sz; ++i)
H[t][i][j] = (H[t][i - 1][j] * base + s[i] - 'a' + 1) % mods[j];
}
}
void oneSolve() {
int ans = 0;
for (int i = 1; i <= n; ++i) {
pair<ll, ll> cur = get(i, 1, strSz[i]);
for (int j = 1; j <= n; ++j) {
if (i == j) continue;
bool c = false;
for (int k = 1; k + strSz[i] - 1 <= strSz[j]; ++k) {
pair<ll, ll> gt = get(j, k, k + strSz[i] - 1);
if (gt.F == cur.F && gt.S == cur.S) {
c = true;
break;
}
}
if (c) ans++;
}
}
cout << ans;
}
void twoSolve() {
map<pair<ll, ll>, int> cnt, hav;
for (int t = 1; t <= n; ++t) {
int sz = strSz[t];
hav.clear();
for (int i = 1; i <= sz; ++i)
for (int j = i; j <= sz; ++j) {
pair<ll, ll> gt = get(t, i, j);
if (hav.find(gt) != hav.end()) continue;
hav[gt] = 1;
if (cnt.find(gt) == cnt.end()) cnt[gt] = 1;
else cnt[gt]++;
}
}
int ans = 0;
for (int t = 1; t <= n; ++t) {
pair<ll, ll> gt = get(t, 1, strSz[t]);
ans += cnt[gt] - 1;
}
cout << ans;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n;
preprocess();
if (n <= 2000) oneSolve();
else twoSolve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |