結果

問題 No.464 PPAP
ユーザー maimai
提出日時 2016-12-15 22:34:16
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 2,590 bytes
コンパイル時間 1,719 ms
コンパイル使用メモリ 180,732 KB
実行使用メモリ 373,668 KB
最終ジャッジ日時 2024-05-07 15:09:37
合計ジャッジ時間 6,443 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,888 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 5 ms
5,376 KB
testcase_05 AC 3 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 861 ms
72,704 KB
testcase_08 AC 219 ms
35,968 KB
testcase_09 AC 3 ms
5,376 KB
testcase_10 TLE -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>

using namespace std;
typedef unsigned int uint;
typedef long long int ll;
typedef unsigned long long int ull;

#define debugv(v) printf("L%d %s => ",__LINE__,#v);for(auto e:v){cout<<e<<" ";}cout<<endl;
#define debugm(m) printf("L%d %s is..\n",__LINE__,#m);for(auto v:m){for(auto e:v){cout<<e<<" ";}cout<<endl;}
#define debuga(m,w) printf("L%d %s is => ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout<<endl;
#define debugaa(m,w,h) printf("L%d %s is..\n",__LINE__,#m);for(int y=0;y<(h);y++){for(int x=0;x<(w);x++){cout<<(m)[x][y]<<" ";}cout<<endl;}
#define debugaar(m,w,h) printf("L%d %s is..\n",__LINE__,#m);for(int y=0;y<(h);y++){for(int x=0;x<(w);x++){cout<<(m)[y][x]<<" ";}cout<<endl;}
#define ALL(v) (v).begin(),(v).end()
#define BIGINT 0x7FFFFFFF
#define E107 1000000007ll
void printbit(int u){if(u==0)cout<<0;else{int s=0,k=0;for(;0<u;u>>=1,k++)s=(s<<1)|(u&1);for(;0<k--;s>>=1)cout<<(s&1);}}

#define TIME chrono::system_clock::now()
#define MILLISEC(t) (chrono::duration_cast<chrono::milliseconds>(t).count())

template<typename T1,typename T2>
ostream& operator <<(ostream &o,const pair<T1,T2> p){o<<"("<<p.first<<":"<<p.second<<")";return o;}

int width,height;
int m,n;

string str;

bool is_kaibundp(int left,int right){
    static map<int,bool> memo;
    
    int key = left|(right<<16);
    if (memo.count(key)) return memo[key];
    
    while (left<right){
        if (str[left]!=str[right]){
            return memo[key]=false;
        }
        left++;right--;
    }
    return memo[key]=true;
}


bool is_kaibun(int left,int right){
    
    if (right-left>20) return is_kaibundp(left,right);
    
    while (left<right){
        if (str[left]!=str[right]){
            return false;
        }
        left++;right--;
    }
    return true;
}

int dfs(int idx = 0,int stage = 0,int left = 0){
    static map<int,int> memo;
    
    if (idx == n-1) return 0;
    
    int key = idx|(left<<13)|(stage<<26);
    if (memo.count(key)) return memo[key];
    
    int result = 0;
    switch (stage){ // PPAP
        case 0:
        case 1:
            if (is_kaibun(left,idx)){
                result += dfs(idx+1,stage+1,idx+1);
            }
            result += dfs(idx+1,stage,left);
            break;
        case 2:
            if (is_kaibun(idx+1,n-1)){
                result+=1;
            }
            result += dfs(idx+1,stage,left);
            break;
    }
    return memo[key] = result;
}

int main(){
    int i,j,k;
    int x,y,a,b;
    
    cin >> str;
    n = str.size();
    
    cout << dfs() << endl;

    return 0;
}
0