結果
問題 | No.263 Common Palindromes Extra |
ユーザー |
![]() |
提出日時 | 2017-06-11 21:33:42 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 175 ms / 2,000 ms |
コード長 | 1,992 bytes |
コンパイル時間 | 1,557 ms |
コンパイル使用メモリ | 172,440 KB |
実行使用メモリ | 162,316 KB |
最終ジャッジ日時 | 2024-11-29 23:15:03 |
合計ジャッジ時間 | 2,969 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 12 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define int long long#define rep(i,n) for(int i=0;i<(n);i++)#define pb push_back#define all(v) (v).begin(),(v).end()#define fi first#define se secondtypedef vector<int>vint;typedef pair<int,int>pint;typedef vector<pint>vpint;template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}struct PalindromicTree{struct node{map<char,int>nex;int len,suflink,height,firapp;//length,suffix link,height,first appearance};string s;vector<node>v;int n,suf;bool add(int pos){char ch=s[pos];int cur=suf;while(true){if(pos-1-v[cur].len>=0&&s[pos-1-v[cur].len]==ch)break;cur=v[cur].suflink;}if(v[cur].nex.count(ch)){suf=v[cur].nex[ch];return false;}suf=n++;v[suf].len=v[cur].len+2;v[suf].firapp=pos;v[cur].nex[ch]=suf;if(v[suf].len==1){ // even lengthv[suf].suflink=1;v[suf].height=1;return true;}while(true){cur=v[cur].suflink;if(pos-1-v[cur].len>=0&&s[pos-1-v[cur].len]==ch){v[suf].suflink=v[cur].nex[ch];break;}}v[suf].height=1+v[v[suf].suflink].height;return true;}void init(const string &s){this->s=s;v.clear();v.resize(s.size()+10);n=2;suf=1;v[0].firapp=v[1].firapp=-1;v[0].len=-1;v[1].len=0;v[0].suflink=v[1].suflink=0;v[0].height=v[1].height=0;}};int dps[1111111],dpt[1111111];signed main(){cin.tie(0);ios_base::sync_with_stdio(0);string S,T;cin>>S>>T;string ST=S+"@*"+T;PalindromicTree pt;pt.init(ST);for(int i=0;i<ST.size();i++){pt.add(i);if(i<S.size())dps[pt.suf]++;else if(i>S.size())dpt[pt.suf]++;}int ans=0;for(int i=pt.n-1;i>=2;i--){ans+=dps[i]*dpt[i];dps[pt.v[i].suflink]+=dps[i];dpt[pt.v[i].suflink]+=dpt[i];}cout<<ans<<endl;return 0;}