#include #include #include const long long int MOD=1e9+7; const long long int BASE=31; using namespace std; vector memo; vector memd; struct RollingHush { vector hash; vector power; string str; RollingHush(string s) : hash(s.size()+1), power(s.size()+1) { str=s; hash[0]=0; power[0]=1; for(int si=0; si " << (rh.size()+1)/2+i-1 << "-" << (rh.size()+1)/2+i << endl; // if(rh.get(rh.size()/2-i, rh.size()/2-i+1)==rh.get((rh.size()+1)/2+i-1, (rh.size()+1)/2+i)) { // cout << i << endl; // dp[i] += dp[i-1]; // } // if(rh.get(0, rh.size()/2-i)==rh.get((rh.size()+1)/2+i, rh.size())) { // dp_sum[i+1] += dp_sum[i]+dp[i]; // } // } // return dp_sum[rh.size()/2+1]; // } long long int count_kaibunkai(RollingHush rh, int left, int right) { long long int count=1; if(right-left<=1) { return count; } if(memd[left]) { return memo[left]; } int l=left+1, r=right-1; while(l> str; memo.assign(str.size()/2+1, 0); memd.assign(str.size()/2+1, 0); RollingHush rh_str(str); cout << count_kaibunkai(rh_str, 0, str.size()) << endl; return 0; }