正题

题目链接:https://www.luogu.com.cn/problem/P1117


题目大意

长度为nnn的字符串,求所有子串有多少种分割成AABBAABBAABB的方式。


解题思路

aia_iai​表示以iii结尾的子串中有多少种分割成AAAAAA的方式
bib_ibi​表示以iii开头的子串中有多少种分割成AAAAAA的方式

然后答案就是∑i=1n−1aibi+1\sum_{i=1}^{n-1}a_ib_{i+1}i=1∑n−1​ai​bi+1​

考虑用SASASA来计算a,ba,ba,b。

枚举长度lenlenlen,考虑所有长度为2∗len2*len2∗len的AAAAAA串,我们没隔lenlenlen格放置一个点,那么每个串必定经过了两个点,现在考虑求出相邻两个点之间的贡献

对于相邻两个点l,rl,rl,r,求出它们的LCPLCPLCP和LCSLCSLCS,分情况讨论

  1. LCP+LCS<len:LCP+LCS<len:LCP+LCS<len:那么我们可以发现没有任何一个串2∗len2*len2∗len的AAAAAA串同时经过这两个点,因为在lll的右边和rrr的左边,这两个串必定有一个地方不同。
  2. LCP+LCS≥len:LCP+LCS\geq len:LCP+LCS≥len:那么此时有串经过这两个点,且
    s≥l−LCP+1,t≤r+LCPs\geq l-LCP+1,t\leq r+LCPs≥l−LCP+1,t≤r+LCP的串都满足条件

时间复杂度:O(nlog⁡n):O(n\log n):O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int T,n;
long long ans,a[N],b[N];
struct SA{char s[N];int m,sa[N],rk[N],height[N],lg[N];int c[N],x[N],y[N],st[N][25];void Qsort(){for(int i=1;i<=m;i++) c[i]=0;for(int i=1;i<=n;i++) c[x[i]]++;for(int i=1;i<=m;i++) c[i]+=c[i-1];for(int i=n;i>=1;i--) sa[c[x[y[i]]]--]=y[i],y[i]=0;return;}void Get_SA(){m=256;for(int i=1;i<=n;i++)x[i]=s[i],y[i]=i;Qsort();for(int w=1;w<=n;w<<=1){int p=0;for(int i=n-w+1;i<=n;i++) y[++p]=i;for(int i=1;i<=n;i++)if(sa[i]>w) y[++p]=sa[i]-w;Qsort();swap(x,y);x[sa[1]]=p=1;for(int i=2;i<=n;i++)x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+w]==y[sa[i-1]+w])?p:++p;if(p==n) break;m=p;}return;}void Get_Height(){int k=0;for(int i=1;i<=n;i++)rk[sa[i]]=i;for(int i=1;i<=n;i++){if(rk[i]==1) continue;if(k)k--;int j=sa[rk[i]-1];while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;height[rk[i]]=k;}return;}void Get_ST(){lg[0]=-1;for(int i=1;i<=n;i++)lg[i]=lg[i>>1]+1,st[i][0]=height[i];for(int j=1;(1<<j)<=n;j++)for(int i=1;i+(1<<j)-1<=n;i++)st[i][j]=min(st[i+(1<<(j-1))][j-1],st[i][j-1]);return;}void Build(){memset(rk,0,sizeof(rk));memset(st,0,sizeof(st));memset(height,0,sizeof(height));memset(sa,0,sizeof(sa));memset(x,0,sizeof(x));memset(y,0,sizeof(y));Get_SA();Get_Height();Get_ST();return;}int LCP(int l,int r){l=rk[l];r=rk[r];if(l>r) swap(l,r);l++;int z=lg[r-l+1];return min(st[l][z],st[r+1-(1<<z)][z]);}
}s1,s2;
int main()
{scanf("%d",&T);while(T--){memset(a,0,sizeof(a));memset(b,0,sizeof(b));scanf("%s",s1.s+1);n=strlen(s1.s+1);for(int i=1;i<=n;i++)s2.s[n-i+1]=s1.s[i];s1.Build();s2.Build();for(int len=1;len<=n/2;len++){for(int i=len;i<=n;i+=len){int l=i,r=i+len;int L=n-r+2,R=n-l+2;int lcp=min(len,s1.LCP(l,r));int lcs=min(len-1,s2.LCP(L,R));if(lcp+lcs>=len){b[l-lcs]++;b[l+lcp-len+1]--;a[r+lcp]--;a[r-lcs+len-1]++;}}}ans=0;for(int i=1;i<=n;i++){a[i]+=a[i-1],b[i]+=b[i-1];ans+=a[i-1]*b[i];}printf("%lld\n",ans);}return 0;
}

P1117-[NOI2016]优秀的拆分【SA】相关推荐

  1. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

  2. P1117 [NOI2016]优秀的拆分

    $ \color{#0066ff}{ 题目描述 }$ 如果一个字符串可以被拆分为\(AABB\)的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串\(aab ...

  3. [NOI2016] 优秀的拆分 题解

    [NOI2016] 优秀的拆分 题解 link 题意 \(T\) 组询问,每组一个字符串 \(s\) 求 \(s\) 所有字串分成 \(AABB\) 的方案数之和. \(A,B\) 为非空串. 题解 ...

  4. NOI2016 优秀的拆分(图解)

    如果一个字符串可以被拆分为 AABB 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A=aab,B=a,我们就找到了这个字符 ...

  5. BZOJ.4650.[NOI2016]优秀的拆分(后缀数组 思路)

    BZOJ 洛谷 令\(st[i]\)表示以\(i\)为开头有多少个\(AA\)这样的子串,\(ed[i]\)表示以\(i\)结尾有多少个\(AA\)这样的子串.那么\(Ans=\sum_{i=1}^{ ...

  6. 【NOI2016】优秀的拆分(后缀数组)

    题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaa,如果令 A=aab,B=a,我们就找 ...

  7. [BZOJ]4650 优秀的拆分(Noi2016)

    比较有意思的一道后缀数组题.(小C最近是和后缀数组淦上了?) 放在NOI的考场上.O(n^3)暴力80分,O(n^2)暴力95分-- 即使想把它作为一道签到题也不要这么随便啊摔(╯‵□′)╯︵┻━┻ ...

  8. NOI 2016 优秀的拆分 (后缀数组+差分)

    题目大意:给你一个字符串,求所有子串的所有优秀拆分总和,优秀的拆分被定义为一个字符串可以被拆分成4个子串,形如$AABB$,其中$AA$相同,$BB$相同,$AB$也可以相同 作为一道国赛题,95分竟 ...

  9. CSP - J 2020 T1 优秀的拆分

    https://www.luogu.com.cn/problem/P7071 /* CSP - J 2020 T1 优秀的拆分 https://www.luogu.com.cn/problem/P70 ...

  10. 信息学奥赛一本通 2004:【20CSPJ普及组】优秀的拆分 | 洛谷 P7071 [CSP-J2020] 优秀的拆分

    [题目链接] ybt 2004:[20CSPJ普及组]优秀的拆分 洛谷 P7071 [CSP-J2020] 优秀的拆分 [题目考点] 数制 基数:即进制数.十进制的基数是10,二进制的基数是2. 按位 ...

最新文章

  1. 警告:隐式声明与内建函数‘exit‘不兼容解决方案
  2. QSAR生命的发动机卟啉c20h14n4---用反向传导做卟啉的分子模型
  3. [Craftor原创]EZ-USB与FPGA的通信接口设计
  4. php5.4与php5.2,升级php 5.2.14 到5.4.11版本报错问题
  5. CDN调试—Debug Headers
  6. Linux内核代码,第一次看到这样使用的宏
  7. Repeater控件里面取不到CheckBox的值
  8. django url 生效_django 定制管理页面外观 模板文件不生效的解决方法
  9. 全网销售额超 2.67 亿!德施曼连续 5 年蝉联双11全网智能锁销冠
  10. React-Native 使用自定义IconFont
  11. pyqt5 加载gif_PyQt5:在Qmovi中重新加载gif
  12. 悟空CRM客户关系管理系统测试
  13. 刘士颉老师——德鲁克“卓有成效”管理理论的践行者,曾任宜信公司培训负责人
  14. html设置ie9兼容性视图,ie9兼容性设置在哪里 IE兼容性视图在哪里设置?
  15. 【华人学者风采】聂建云 蒙特利尔大学
  16. 看 SICP 不如先看 The Little Schemer
  17. 【Cocos Creator实战教程(6)】——镜头跟随
  18. 记录一次dns劫持及其解决办法
  19. 怎么制作游戏脚本_我应该怎么样来推荐我们制作的这款RPG游戏呢?
  20. 仿win10系统UI界面纯html网页网站后台UI界面

热门文章

  1. redis在linux搭建集群,Linux/Centos 7 redis4 集群搭建
  2. 11尺寸长宽 iphone_LED显示屏的尺寸规格计算方法
  3. mysql快照过久_Oracle 快照(snapshot) 管理
  4. librosa能量_语音MFCC提取:librosa amp;amp; python_speech_feature(2019.12)
  5. 西北工业大学计算机毕业论文,光纤通信发射机本科毕业论文 西北工业大学.docx...
  6. android ble status,Android BLE peripheral disconnects with status code BLE_HCI_INSTANT_PASSED(0x28)
  7. harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架
  8. linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
  9. 禁用笔记本键盘_如何禁用/启用笔记本内置键盘?
  10. [RabbitMQ]队列持久化