結果

問題 No.1725 [Cherry 3rd Tune D] 無言の言葉
ユーザー monnumonnu
提出日時 2021-12-02 21:56:32
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 176 ms / 4,000 ms
コード長 2,101 bytes
コンパイル時間 3,880 ms
コンパイル使用メモリ 228,700 KB
実行使用メモリ 23,924 KB
最終ジャッジ日時 2023-09-18 10:39:03
合計ジャッジ時間 11,608 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 2 ms
4,376 KB
testcase_03 AC 5 ms
4,376 KB
testcase_04 AC 2 ms
4,376 KB
testcase_05 AC 2 ms
4,376 KB
testcase_06 AC 12 ms
4,380 KB
testcase_07 AC 6 ms
4,376 KB
testcase_08 AC 9 ms
4,380 KB
testcase_09 AC 2 ms
4,380 KB
testcase_10 AC 5 ms
4,380 KB
testcase_11 AC 2 ms
4,376 KB
testcase_12 AC 12 ms
4,380 KB
testcase_13 AC 12 ms
4,376 KB
testcase_14 AC 97 ms
4,380 KB
testcase_15 AC 14 ms
4,380 KB
testcase_16 AC 21 ms
4,776 KB
testcase_17 AC 38 ms
4,852 KB
testcase_18 AC 116 ms
4,376 KB
testcase_19 AC 31 ms
4,380 KB
testcase_20 AC 12 ms
4,380 KB
testcase_21 AC 107 ms
4,376 KB
testcase_22 AC 118 ms
9,680 KB
testcase_23 AC 111 ms
9,124 KB
testcase_24 AC 81 ms
7,212 KB
testcase_25 AC 138 ms
13,852 KB
testcase_26 AC 115 ms
11,232 KB
testcase_27 AC 103 ms
15,004 KB
testcase_28 AC 157 ms
14,548 KB
testcase_29 AC 152 ms
14,004 KB
testcase_30 AC 142 ms
16,328 KB
testcase_31 AC 89 ms
9,152 KB
testcase_32 AC 176 ms
21,392 KB
testcase_33 AC 168 ms
21,700 KB
testcase_34 AC 168 ms
20,176 KB
testcase_35 AC 163 ms
18,224 KB
testcase_36 AC 176 ms
19,948 KB
testcase_37 AC 134 ms
4,380 KB
testcase_38 AC 133 ms
4,376 KB
testcase_39 AC 135 ms
4,380 KB
testcase_40 AC 137 ms
4,376 KB
testcase_41 AC 134 ms
4,376 KB
testcase_42 AC 2 ms
4,376 KB
testcase_43 AC 35 ms
23,924 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