結果
問題 | No.263 Common Palindromes Extra |
ユーザー |
![]() |
提出日時 | 2019-11-02 22:51:14 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 281 ms / 2,000 ms |
コード長 | 2,479 bytes |
コンパイル時間 | 1,638 ms |
コンパイル使用メモリ | 173,052 KB |
実行使用メモリ | 161,280 KB |
最終ジャッジ日時 | 2024-09-14 23:26:36 |
合計ジャッジ時間 | 3,943 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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 eb emplace_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;}template<class A,class B>ostream& operator<<(ostream& ost,const pair<A,B>&p){ost<<"{"<<p.first<<","<<p.second<<"}";return ost;}template<class T>ostream& operator<<(ostream& ost,const vector<T>&v){ost<<"{";for(int i=0;i<v.size();i++){if(i)ost<<",";ost<<v[i];}ost<<"}";return ost;}/*p->xpx : node(p).nex[x]=node_id(xpx) (enlarge link)aabaa->aa : node(aabaa).suflink=node_id(aa) (suffix link)sufs[i] : node_id(longest suffix-palindrome of s[0,i])*/struct PalindromicTree{struct Node{map<char,int>nex;int len,suflink,cnt;Node(int len,int suflink,int cnt):len(len),suflink(suflink),cnt(cnt){}};string s;vector<Node>v;vector<int>sufs;int pos,suf;PalindromicTree():pos(0),suf(1){v.eb(-1,0,0);v.eb(0,0,0);}void add(const string &t){s+=t;}void uku(){assert(pos<s.size());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];v[suf].cnt++;return;}suf=v.size();v.eb(v[cur].len+2,-1,1);v[cur].nex[ch]=suf;if(v[suf].len==1){v[suf].suflink=1;return;}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];return;}}}void process(){uku();pos++;sufs.pb(suf);}};int dps[1111111],dpt[1111111];signed main(){string S,T;cin>>S>>T;PalindromicTree pt;pt.add(S);pt.add("@*");pt.add(T);rep(i,pt.s.size())pt.process();rep(i,S.size())dps[pt.sufs[i]]++;rep(i,T.size())dpt[pt.sufs[S.size()+2+i]]++;int ans=0;for(int i=(int)pt.v.size()-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;}