SRM 632 div 1

今回もeasyだけ解いてsystest通った.
解法を思いつくのが遅すぎ
1294 -> 1335
解法は適当な長さだけ答えを埋め込んで各[i,j]に対して一致するかをひたすらチェックするだけ

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int b[] = {0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0};
class PotentialArithmeticSequence{
public:
    vector<int> D;
    bool ch(int i, int j){
        int ma = 0;
        int p = -1;
        for(int k = i; k <= j; k++){
            if(D[k] > ma){
                p = k;
                ma = D[k];
            }
        }
        if(ma >= 5){
            int idx = 0;
            for(int k = p+1; k <= j; k++){
                if(D[k]!=b[idx]) return false;
                idx++;
            }
            idx = 0;
            for(int k = p-1; k >= i; k--){
                if(D[k]!=b[idx]) return false;
                idx++;
            }
        }else{
            int k;
            for(k = 0; k < 50; k++){
                if(b[k] == ma){
                    break;
                }
            }
            int idx = 1;
            for(int t = p+1; t <= j; t++){
                if(D[t] != b[k+idx]) return false;
                idx++;
            }
            idx = 1;
            for(int t = p-1; t >= i; t--){
                if(D[t] != b[k+idx]) return false;
                idx++;
            }
        }
        return true;
    }
    int numberOfSubsequences(vector <int> d){
        int n = d.size();
        int ans = n;
        D = d;
        for(int i = 0; i < n; i++){
            for(int j = i+1; j < n; j++){
                if(ch(i,j)) ans++;
            }
        }
        return ans;
    }
};