結果
| 問題 |
No.1725 [Cherry 3rd Tune D] 無言の言葉
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2021-10-29 21:47:03 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 185 ms / 4,000 ms |
| コード長 | 1,876 bytes |
| コンパイル時間 | 1,769 ms |
| コンパイル使用メモリ | 176,700 KB |
| 実行使用メモリ | 29,952 KB |
| 最終ジャッジ日時 | 2024-10-07 10:47:35 |
| 合計ジャッジ時間 | 6,893 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 42 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int dfs(int p, long long L, long long R, char C, int N, int M, vector<vector<int>> &S, vector<vector<int>> &T, vector<long long> &len, vector<vector<long long>> &cnt){
if (p == 0){
return S[R][C - 'a'] - S[L][C - 'a'];
}
if (L == 0 && R == len[p]){
return cnt[p][C - 'a'];
}
int ans = 0;
if (L < len[p - 1]){
ans += dfs(p - 1, L, min(R, len[p - 1]), C, N, M, S, T, len, cnt);
}
if (L < len[p - 1] + M && R > len[p - 1]){
int L2 = max(L, len[p - 1]) - len[p - 1];
int R2 = min(R, len[p - 1] + M) - len[p - 1];
ans += T[R2][C - 'a'] - T[L2][C - 'a'];
}
if (R >= len[p - 1] + M){
L -= len[p - 1] + M;
L = max(L, (long long) 0);
R -= len[p - 1] + M;
ans += dfs(p - 1, len[p - 1] - R, len[p - 1] - L, C, N, M, S, T, len, cnt);
}
return ans;
}
int main(){
string X;
cin >> X;
string Y;
cin >> Y;
int N = X.size();
int M = Y.size();
vector<vector<int>> S(N + 1, vector<int>(26, 0));
for (int i = 0; i < N; i++){
for (int j = 0; j < 26; j++){
S[i + 1][j] = S[i][j];
}
S[i + 1][X[i] - 'a']++;
}
vector<vector<int>> T(M + 1, vector<int>(26, 0));
for (int i = 0; i < M; i++){
for (int j = 0; j < 26; j++){
T[i + 1][j] = T[i][j];
}
T[i + 1][Y[i] - 'a']++;
}
vector<long long> len(30);
vector<vector<long long>> cnt(30, vector<long long>(26, 0));
len[0] = N;
for (int i = 0; i < 26; i++){
cnt[0][i] = S[N][i];
}
for (int i = 0; i < 29; i++){
len[i + 1] = len[i] * 2 + M;
for (int j = 0; j < 26; j++){
cnt[i + 1][j] = cnt[i][j] * 2 + T[M][j];
}
}
int p = 30;
while (len[p - 1] > 1000000000){
p--;
}
int Q;
cin >> Q;
for (int i = 0; i < Q; i++){
int L, R;
char C;
cin >> L >> R >> C;
L--;
cout << dfs(p, L, R, C, N, M, S, T, len, cnt) << endl;
}
}
SSRS