CF17E:Palisection——题解
生活随笔
收集整理的這篇文章主要介紹了
CF17E:Palisection——题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://vjudge.net/problem/CodeForces-17E
http://codeforces.com/problemset/problem/17/E
題目大意:給一個長度為n的字符串,求不相交的回文串對數。
————————————————————————————
點擊這里看大佬的題解。
#include<cstdio> #include<cstring> #include<algorithm> #define N 2000010 #define MOD 51123987 using namespace std; typedef long long ll; ll mx,id,p[2*N],f[2*N],g[2*N]; //g[i]以i為終點的回文串個數 //f[i]以i為起點的回文串個數 char s[2*N]; int main(){int l;scanf("%d%s",&l,s+1);s[0]='@';ll sum=0;for(int i=l;i>=1;i--)s[i*2]=s[i];for(int i=1;i<=2*l+1;i+=2)s[i]='#';s[2*l+2]='?';l=2*l+1;for(int i=1;i<=l;i++){if(mx>i)p[i]=min(p[2*id-i],mx-i);else p[i]=1;while(s[i-p[i]]==s[i+p[i]])p[i]++;if(i+p[i]>mx){mx=i+p[i];id=i;}sum+=(p[i]-1)>>1;if(i%2==0)sum++;sum%=MOD;}sum=sum*(sum-1)/2;for(int i=2;i<=l;i+=2){f[i-p[i]+2]++;f[i+2]--;g[i]++;g[i+p[i]]--;}for(int i=1;i<=l;i+=2){f[i-p[i]+2]++;f[i+1]--;g[i+1]++;g[i+p[i]]--;}for(int i=2;i<=l;i+=2){f[i]+=f[i-2];f[i]%=MOD;g[i]+=g[i-2];g[i]%=MOD;}f[l+1]=0;for(int i=l-1;i>=1;i-=2){f[i]+=f[i+2];f[i]%=MOD;}for(int i=2;i<=l;i+=2){sum-=g[i]*f[i+2]%MOD;sum=(sum+MOD)%MOD;}printf("%lld\n",(sum%MOD+MOD)%MOD);return 0; }?
轉載于:https://www.cnblogs.com/luyouqi233/p/7978622.html
總結
以上是生活随笔為你收集整理的CF17E:Palisection——题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IPV4 VS IPV6 谈
- 下一篇: JavaScript 学习笔记(1)