QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#280588 | #7780. Dark LaTeX vs. Light LaTeX | ucup-team1469# | Compile Error | / | / | C++17 | 5.3kb | 2023-12-09 17:08:47 | 2023-12-09 17:08:47 |
Judging History
你现在查看的是最新测评结果
- [2024-11-25 20:53:52]
- hack成功,自动添加数据
- (/hack/1258)
- [2023-12-09 17:08:47]
- 评测
- 测评结果:Compile Error
- 用时:0ms
- 内存:0kb
- [2023-12-09 17:08:47]
- 提交
answer
#ifndef LOCAL
#define FAST_IO
#endif
// ============
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
#define OVERRIDE(a, b, c, d, ...) d
#define REP2(i, n) for (i32 i = 0; i < (i32)(n); ++i)
#define REP3(i, m, n) for (i32 i = (i32)(m); i < (i32)(n); ++i)
#define REP(...) OVERRIDE(__VA_ARGS__, REP3, REP2)(__VA_ARGS__)
#define PER(i, n) for (i32 i = (i32)(n) - 1; i >= 0; --i)
#define ALL(x) begin(x), end(x)
using namespace std;
using u32 = unsigned int;
using u64 = unsigned long long;
using i32 = signed int;
using i64 = signed long long;
using f64 = double;
using f80 = long double;
template <typename T>
using Vec = vector<T>;
template <typename T>
bool chmin(T &x, const T &y) {
if (x > y) {
x = y;
return true;
}
return false;
}
template <typename T>
bool chmax(T &x, const T &y) {
if (x < y) {
x = y;
return true;
}
return false;
}
#ifdef INT128
using u128 = __uint128_t;
using i128 = __int128_t;
istream &operator>>(istream &is, i128 &x) {
i64 v;
is >> v;
x = v;
return is;
}
ostream &operator<<(ostream &os, i128 x) {
os << (i64)x;
return os;
}
istream &operator>>(istream &is, u128 &x) {
u64 v;
is >> v;
x = v;
return is;
}
ostream &operator<<(ostream &os, u128 x) {
os << (u64)x;
return os;
}
#endif
[[maybe_unused]] constexpr i32 INF = 1000000100;
[[maybe_unused]] constexpr i64 INF64 = 3000000000000000100;
struct SetUpIO {
SetUpIO() {
#ifdef FAST_IO
ios::sync_with_stdio(false);
cin.tie(nullptr);
#endif
cout << fixed << setprecision(15);
}
} set_up_io;
// ============
#ifdef DEBUGF
#else
#define DBG(x) (void) 0
#endif
#include <atcoder/string>
// ============
#include <algorithm>
#include <cassert>
#include <utility>
#include <vector>
#include <functional>
template <typename T, typename F = std::less<T>>
class SparseTable {
std::vector<std::vector<T>> table;
int s;
const F f;
int log2(int n) const {
return 31 - __builtin_clz(n);
}
T min2(const T &x, const T &y) const {
if (f(x, y)) {
return x;
} else {
return y;
}
}
public:
SparseTable(std::vector<T> arr, const F &f = F()) : s((int) arr.size()), f(f) {
if (s == 0) {
return;
}
int m = log2(s);
table.resize(m + 1);
table[0] = std::move(arr);
for (int i = 1; i <= m; ++i) {
int w = 1 << i;
table[i].resize(s - w + 1);
for (int j = 0; j < (int) table[i].size(); ++j) {
table[i][j] = min2(table[i - 1][j], table[i - 1][j + (w >> 1)]);
}
}
}
int size() const {
return s;
}
// not empty
T min(int l, int r) const {
assert(l >= 0 && l < r && r <= s);
int m = log2(r - l);
return min2(table[m][l], table[m][r - (1 << m)]);
}
};
// ============
class StrInfo {
string s;
Vec<i32> sa;
Vec<i32> inv;
Vec<i32> lcp;
SparseTable<i32> sp;
public:
StrInfo(string s) : s(s), sa(atcoder::suffix_array(s)), inv(s.size()), lcp(atcoder::lcp_array(s, sa)), sp(lcp) {
REP(i, sa.size()) {
inv[sa[i]] = i;
}
}
i32 getlcp(i32 x, i32 y) const {
if (x == y) {
return (i32)s.size() - x;
}
x = inv[x];
y = inv[y];
if (x > y) {
swap(x, y);
}
return sp.min(x, y);
}
};
i64 solve(const string &s, const string &t) {
i32 n = (i32)s.size();
i32 m = (i32)t.size();
string src = s + "$" + t;
StrInfo info(src);
Vec<Vec<i32>> cnt(n, Vec<i32>(n + 2, 0));
REP(i, n) REP(j, m) {
i32 lcp = info.getlcp(i, n + 1 + j);
cnt[i][i + 1] += 1;
cnt[i][i + lcp + 1] -= 1;
}
REP(i, n) REP(j, n + 1) {
cnt[i][j + 1] += cnt[i][j];
}
REP(i, n) {
cnt[i].pop_back();
}
DBG(cnt);
Vec<Vec<i32>> sum(n + 1, Vec<i32>(n + 1, 0));
REP(r, n + 1) {
REP(l, n) {
sum[r][l + 1] = sum[r][l] + cnt[l][r];
}
}
i64 ans = 0;
REP(l, n) REP(r, l + 1, n + 1) {
i32 mx = min(r - l, info.getlcp(l, r));
ans += sum[r][l + mx + 1] - sum[r][l + 1];
//cerr << l << ' ' << r << ' ' << mx << ' ' << sum[r][l + mx + 1] - sum[r][l + 1] << '\n';
}
//cerr << '\n';
return ans;
}
int main() {
string s, t;
cin >> s >> t;
i64 ans = 0;
REP(iter, 2) {
ans += solve(s, t);
reverse(ALL(s));
reverse(ALL(t));
swap(s, t);
}
StrInfo info(s + "$" + t);
i32 n = (i32)s.size();
i32 m = (i32)t.size();
REP(i, n) REP(j, m) {
ans += info.getlcp(i, n + 1 + j);
}
cout << ans << '\n';
}
详细
answer.code:110:10: fatal error: atcoder/string: No such file or directory 110 | #include <atcoder/string> | ^~~~~~~~~~~~~~~~ compilation terminated.