結果
| 問題 |
No.1725 [Cherry 3rd Tune D] 無言の言葉
|
| コンテスト | |
| ユーザー |
KoD
|
| 提出日時 | 2021-10-29 21:51:33 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 68 ms / 4,000 ms |
| コード長 | 3,181 bytes |
| コンパイル時間 | 3,499 ms |
| コンパイル使用メモリ | 255,736 KB |
| 実行使用メモリ | 44,288 KB |
| 最終ジャッジ日時 | 2024-10-07 10:54:20 |
| 合計ジャッジ時間 | 6,599 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 42 |
ソースコード
#include <bits/stdc++.h>
using i32 = std::int32_t;
using u32 = std::uint32_t;
using i64 = std::int64_t;
using u64 = std::uint64_t;
using isize = std::ptrdiff_t;
using usize = std::size_t;
class rep {
struct Iter {
usize itr;
constexpr Iter(const usize pos) noexcept : itr(pos) {}
constexpr void operator++() noexcept { ++itr; }
constexpr bool operator!=(const Iter& other) const noexcept { return itr != other.itr; }
constexpr usize operator*() const noexcept { return itr; }
};
const Iter first, last;
public:
explicit constexpr rep(const usize first, const usize last) noexcept : first(first), last(std::max(first, last)) {}
constexpr Iter begin() const noexcept { return first; }
constexpr Iter end() const noexcept { return last; }
};
template <class F> struct RecursiveLambda : private F {
explicit constexpr RecursiveLambda(F&& f) : F(std::forward<F>(f)) {}
template <class... Args> constexpr decltype(auto) operator()(Args&&... args) const {
return F::operator()(*this, std::forward<Args>(args)...);
}
};
template <class F> constexpr decltype(auto) rec_lambda(F&& f) {
using G = std::decay_t<F>;
return RecursiveLambda<G>(std::forward<G>(f));
}
template <class T> using Vec = std::vector<T>;
std::array<Vec<usize>, 26> count(const std::string& s) {
const auto n = s.size();
std::array<Vec<usize>, 26> ret;
for (const auto k : rep(0, 26)) {
const char c = 'a' + k;
ret[k] = Vec<usize>(n + 1);
for (const auto i : rep(0, n)) {
ret[k][i + 1] = ret[k][i] + (s[i] == c);
}
}
return ret;
}
void main_() {
std::string X, Y;
std::cin >> X >> Y;
usize Q;
std::cin >> Q;
Vec<usize> len;
len.push_back(X.size());
while (len.back() < 1000000000) {
len.push_back(len.back() + Y.size() + len.back());
}
const auto cntX = count(X);
const auto cntY = count(Y);
std::array<usize, 26> allX, allY;
for (const auto i : rep(0, 26)) {
allX[i] = cntX[i][X.size()];
allY[i] = cntY[i][Y.size()];
}
Vec<std::array<usize, 26>> whole(len.size());
whole[0] = allX;
for (const auto i : rep(1, len.size())) {
for (const auto k : rep(0, 26)) {
whole[i][k] = 2 * whole[i - 1][k] + allY[k];
}
}
const auto dfs = rec_lambda([&](auto&& dfs, const usize level, usize r, const usize k) -> usize {
if (r == len[level]) return whole[level][k];
if (level == 0) return cntX[k][r];
if (r <= len[level - 1]) return dfs(level - 1, r, k);
r -= len[level - 1];
usize ret = whole[level - 1][k];
if (r <= Y.size()) return ret + cntY[k][r];
r -= Y.size();
ret += allY[k];
return ret + whole[level - 1][k] - dfs(level - 1, len[level - 1] - r, k);
});
while (Q--) {
usize l, r;
char c;
std::cin >> l >> r >> c;
std::cout << dfs(len.size() - 1, r, c - 'a') - dfs(len.size() - 1, l - 1, c - 'a') << '\n';
}
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
main_();
return 0;
}
KoD