結果

問題 No.1725 [Cherry 3rd Tune D] 無言の言葉
ユーザー monnumonnu
提出日時 2021-12-02 21:56:32
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 178 ms / 4,000 ms
コード長 2,101 bytes
コンパイル時間 3,753 ms
コンパイル使用メモリ 231,956 KB
実行使用メモリ 24,412 KB
最終ジャッジ日時 2024-07-05 02:07:44
合計ジャッジ時間 9,835 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,812 KB
testcase_01 AC 2 ms
6,944 KB
testcase_02 AC 3 ms
6,944 KB
testcase_03 AC 5 ms
6,944 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 3 ms
6,940 KB
testcase_06 AC 12 ms
6,940 KB
testcase_07 AC 6 ms
6,940 KB
testcase_08 AC 9 ms
6,944 KB
testcase_09 AC 2 ms
6,940 KB
testcase_10 AC 5 ms
6,944 KB
testcase_11 AC 2 ms
6,944 KB
testcase_12 AC 12 ms
6,940 KB
testcase_13 AC 13 ms
6,940 KB
testcase_14 AC 98 ms
6,940 KB
testcase_15 AC 13 ms
6,940 KB
testcase_16 AC 20 ms
6,940 KB
testcase_17 AC 37 ms
6,940 KB
testcase_18 AC 114 ms
6,940 KB
testcase_19 AC 31 ms
6,940 KB
testcase_20 AC 13 ms
6,944 KB
testcase_21 AC 103 ms
6,940 KB
testcase_22 AC 116 ms
9,956 KB
testcase_23 AC 112 ms
9,472 KB
testcase_24 AC 81 ms
7,552 KB
testcase_25 AC 140 ms
14,080 KB
testcase_26 AC 113 ms
11,220 KB
testcase_27 AC 104 ms
15,384 KB
testcase_28 AC 157 ms
14,752 KB
testcase_29 AC 153 ms
14,336 KB
testcase_30 AC 140 ms
16,580 KB
testcase_31 AC 86 ms
9,472 KB
testcase_32 AC 178 ms
21,592 KB
testcase_33 AC 170 ms
22,060 KB
testcase_34 AC 169 ms
20,548 KB
testcase_35 AC 165 ms
18,608 KB
testcase_36 AC 176 ms
20,448 KB
testcase_37 AC 138 ms
6,944 KB
testcase_38 AC 138 ms
6,944 KB
testcase_39 AC 131 ms
6,940 KB
testcase_40 AC 131 ms
6,940 KB
testcase_41 AC 133 ms
6,940 KB
testcase_42 AC 1 ms
6,940 KB
testcase_43 AC 35 ms
24,412 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll=long long;
using Graph=vector<vector<int>>;
#define INF 1000000000
#define MOD 998244353
#define MAX 1000000

string X,Y;

int dfs(int i,int R,char c,vector<int> &length,vector<vector<int>> &cnt,vector<vector<int>> &sumX,vector<vector<int>> &sumY){
  if(i==1){
    return sumX[c-'a'][R];
  }
  if(R<=length[i-1]){
    return dfs(i-1,R,c,length,cnt,sumX,sumY);
  }
  if(R<=length[i-1]+(int)Y.size()){
    return cnt[c-'a'][i-1]+sumY[c-'a'][R-length[i-1]];
  }
  return 2*cnt[c-'a'][i-1]+sumY[c-'a'][Y.size()]-dfs(i-1,2*length[i-1]+(int)Y.size()-R,c,length,cnt,sumX,sumY);
}

int main(){
  int Q;
  cin>>X>>Y>>Q;
  vector<vector<int>> sumY(26,vector<int>(Y.size()+1,0));
  vector<vector<int>> sumX(26,vector<int>(X.size()+1,0));
  for(int j=0;j<Y.size();j++){
    for(int i=0;i<26;i++){
      sumY[i][j+1]=sumY[i][j];
    }
    sumY[Y[j]-'a'][j+1]++;
  }
  for(int j=0;j<X.size();j++){
    for(int i=0;i<26;i++){
      sumX[i][j+1]=sumX[i][j];
    }
    sumX[X[j]-'a'][j+1]++;
  }
  vector<int> length(33);
  vector<vector<int>> cnt(26,vector<int>(33,0));
  length[1]=X.size();
  for(int j=0;j<26;j++){
    cnt[j][1]=sumX[j][X.size()];
  }
  for(int i=2;i<33;i++){
    length[i]=2*length[i-1]+(int)Y.size();
    if(length[i]>INF){
      length[i]=INF;
    }
    for(int j=0;j<26;j++){
      cnt[j][i]=2*cnt[j][i-1]+sumY[j][Y.size()];
      if(cnt[j][i]>INF){
        cnt[j][i]=INF;
      }
    }
  }

  for(int i=0;i<Q;i++){
    int L,R;
    char C;
    cin>>L>>R>>C;
    cout<<dfs(32,R,C,length,cnt,sumX,sumY)-dfs(32,L-1,C,length,cnt,sumX,sumY)<<'\n';
  }
  //X.count(C)=a,Y.count(C)=b
  //F[n].count(C)=(a+b)*2^(n-1)-b
  //len(F[n])=(len(X)+len(Y))*2^(n-1)-len(Y)
  //F(n,C)  =F[n]に含まれるCの数
  //f(n,R,C)=F[n]のR番目までに含まれるCの数
  //        =f(n-1,R,C)                               ; R<=len(F[n-1])
  //        =F(n-1,C)+alpha                           ; len(F[n-1])<R<=len(F[n-1])+len(Y)
  //        =2*F(n-1,C)+alpha-f(n-1,len(F[n])-R,C)  ; R>len(F[n-1])+len(Y)
}
0