#include 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 struct RecursiveLambda : private F { explicit constexpr RecursiveLambda(F&& f) : F(std::forward(f)) {} template constexpr decltype(auto) operator()(Args&&... args) const { return F::operator()(*this, std::forward(args)...); } }; template constexpr decltype(auto) rec_lambda(F&& f) { using G = std::decay_t; return RecursiveLambda(std::forward(f)); } template using Vec = std::vector; std::array, 26> count(const std::string& s) { const auto n = s.size(); std::array, 26> ret; for (const auto k : rep(0, 26)) { const char c = 'a' + k; ret[k] = Vec(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 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 allX, allY; for (const auto i : rep(0, 26)) { allX[i] = cntX[i][X.size()]; allY[i] = cntY[i][Y.size()]; } Vec> 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; }