結果
| 問題 |
No.464 PPAP
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-12-17 01:52:01 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,707 bytes |
| コンパイル時間 | 1,735 ms |
| コンパイル使用メモリ | 170,224 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-30 22:24:04 |
| 合計ジャッジ時間 | 2,625 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 WA * 1 |
ソースコード
#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;}
class manacher{
public:
vector<int> radius;
manacher(){}
manacher(const string& str){make(str);}
void make(const string& str){
// TODO:ざっくりとしか理解してないのでほぼコピペ
// http://snuke.hatenablog.com/entry/2014/12/02/235837
// abaaaa
int length = str.size()*2-1;
radius.resize(length);
int c = 0;
for (int i = 0; i < length; i++) {
int l = c - (i-c);
if (i+radius[l] < c+radius[c]) {
radius[i] = radius[l];
} else {
int j = c+radius[c] - i;
for (;i-j >= 0 && i+j < length ; j++){
if (((i^j)&1)==1) continue;
if (str[(i-j)/2] != str[(i+j)/2]) break;
}
radius[i] = j;
c = i;
}
}
}
int operator[](int idx) const{
return radius[idx];
}
size_t size() const{
return radius.size();
}
void print(const string& str){
for (int i=0;i<str.size();i++){
cout << str[i] << " ";
}
cout << endl;
for (int i=0;i<radius.size();i++){
cout << radius[i];
}
cout << endl;
}
};
int width,height;
int m,n;
string str;
manacher manatee;
int back_imos[101010];
// 4th P
int calc3(int index){
if (manatee.size()-2<=index) return 0;
//cout << "!" << index << endl;
return back_imos[index+2];
}
// 2nd P
int calc2(int index){
int i;
//cout << index << endl;
if (manatee.size()-4<=index) return 0;
//cout << index << endl;
int result = 0;
for (i=index;i<manatee.size();i++){
if (manatee[i] >= i-index+1){
result += calc3(i-index+i+2);
}
}
return result;
}
// 1st P
int calc1(){
int i;
int result = 0;
for (i=0;i<manatee.size();i++){
if (manatee[i] == i+1){
result += calc2(i+i+2);
}
}
return result;
}
void gen_back_imos(){
int i,j,n;
n = manatee.size();
for (i=n-1;0<=i;i--){
j = n-i-1;
if (manatee[i] == j+1){
back_imos[i-j]++;
}
}
for (i=n-1;0<=i;i--){
back_imos[i]+=back_imos[i+1];
}
}
int main(){
int i,j,k;
int x,y,a,b;
cin >> str;
manatee.make(str);
//manatee.print(str);
gen_back_imos();
//debuga(back_imos,29);
cout << calc1() << endl;
return 0;
}