結果
問題 | No.599 回文かい |
ユーザー |
![]() |
提出日時 | 2019-08-24 06:36:00 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,096 bytes |
コンパイル時間 | 1,096 ms |
コンパイル使用メモリ | 121,376 KB |
最終ジャッジ日時 | 2025-01-07 14:50:37 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 6 WA * 16 |
ソースコード
#include <iostream>#include <iomanip>#include <string>#include <cmath>#include <algorithm>#include <vector>#include <set>#include <map>#include <unordered_map>#include <unordered_set>#include <list>#include <stack>#include <queue>#include <bitset>#include <numeric>#include <cassert>#ifdef DEBUG#include "./Lib/debug.hpp"#else#define dump(...)template<class T>inline auto d_val(T a, T b) { return a; }#endif/* (=^o^=) */#define int ll/* macro */#define FOR(i, b, e) for(ll i = (ll)(b); i < (ll)(e); ++i)#define RFOR(i, b, e) for(ll i = (ll)(e-1); i >= (ll)(b); --i)#define REP(i, n) FOR(i, 0, n)#define RREP(i, n) RFOR(i, 0, n)#define REPC(x,c) for(const auto& x:(c))#define REPI2(it,b,e) for(auto it = (b); it != (e); ++it)#define REPI(it,c) REPI2(it, (c).begin(), (c).end())#define RREPI(it,c) REPI2(it, (c).rbegin(), (c).rend())#define REPI_ERACE2(it, b, e) for(auto it = (b); it != (e);)#define REPI_ERACE(it, c) REPI_ERACE2(it, (c).begin(), (c).end())#define ALL(x) (x).begin(),(x).end()#define cauto const auto&/* macro func */#define SORT(x) do{sort(ALL(x));}while(false)#define RSORT(x) do{sort((x).rbegin(),(x).rend());}while(false)#define UNIQUE(v) do{v.erase( unique(v.begin(), v.end()), v.end() );}while(false)#define MAX(x,y) do{x = std::max(x,y);}while(false)#define MIN(x,y) do{x = std::min(x,y);}while(false)#define BR do{cout<<"\n";}while(false)/* type define */using ll = long long;using PAIR = std::pair<ll, ll>;using VS = std::vector<std::string>;using VL = std::vector<long long>;using VVL = std::vector<VL>;using VVVL = std::vector<VVL>;using VD = std::vector<double>;template<class T>using V = std::vector<T>;/* using std */using std::cout;constexpr char endl = '\n';using std::cin;using std::sort;using std::pair;using std::string;using std::stack;using std::queue;using std::vector;using std::list;using std::map;using std::unordered_map;using std::multimap;using std::unordered_multimap;using std::set;using std::unordered_set;using std::unordered_multiset;using std::multiset;using std::bitset;using std::priority_queue;/* constant value */constexpr ll MOD = 1000000007;//constexpr ll MOD = 998244353;/* Initial processing */struct Preprocessing { Preprocessing() { std::cin.tie(0); std::ios::sync_with_stdio(0); }; }_Preprocessing;/* Remove the source of the bug */signed pow(signed, signed) { assert(false); return -1; }/* define hash */namespace std { template <> class hash<std::pair<ll, ll>> { public: size_t operator()(const std::pair<ll, ll>& x) const { return hash<ll>()(1000000000 * x.first + x.second); } }; }/* input */template<class T> std::istream& operator >> (std::istream& is, vector<T>& vec) { for (T& x : vec) is >> x; return is; }//=============================================================================================class ZAlgorithm {const std::vector<int> m_zArray;static auto constrcutZArray(const std::string& str) {auto sz = str.size();auto zArray = std::vector<int>(sz);zArray[0] = sz;int i = 1, j = 0;while (i < sz) {while (i + j < sz && str[j] == str[i + j]) ++j;zArray[i] = j;if (j == 0) { ++i; continue; }int k = 1;while (i + k < sz && k + zArray[k] < j) {zArray[i + k] = zArray[k];++k;}i += k; j -= k;}return zArray;}public:ZAlgorithm(const std::string& str) :m_zArray(constrcutZArray(str)) {}auto getZArray() const {return m_zArray;}/* output fot debug */void debugOutput() const {dump(m_zArray);}};signed main() {string str;cin >> str;auto sz = static_cast<ll>(str.size());VL dp((sz + 1) / 2, 1);REP(i, (sz + 1) / 2) {auto s = str.substr((sz + 1) / 2 - i - 1, 2 * i + 1 + (!(sz & 1)));auto z = ZAlgorithm(s).getZArray();// cout << "-- " << s << " --" << endl;auto ssz = static_cast<ll>(s.size());REP(j, s.size() / 2) {if (z[ssz - (j + 1)] == j + 1) {auto p = ssz / 2 - j - 1;if (p >= 0) {dp[i] += dp[p];dp[i] %= MOD;}};}}dump(dp);cout << *dp.rbegin() << endl;}