bzoj 4480: [Jsoi2013]快乐的jyy
Description
【故事背景】
JYY在JSOI有很多很多的好朋友,比如PUPPY,KFC还有PUPPUP。因为
有了这么多的好朋友,所以JYY每天都很快乐。某天,JYY发现好朋友之间关
系的好坏和名字有很大的关系,比如PUPPY和PUPPUP的关系就特别好,但是
和KFC的关系就很一般。JYY苦思冥想终于发现了其中的规律,现在JYY想知
道两个朋友之间关系的好坏,你能帮助JYY么?
【问题描述】
给定两个字符串A和B,表示JYY的两个朋友的名字。我们用A(i,j)表示A
字符串中从第i个字母到第j个字母所组成的子串。同样的,我们也可以定义B(x,y)。
JYY发现两个朋友关系的紧密程度,等于同时满足如下条件的四元组(i,j,x,y)
的个数:
1:1<=i<=j<=|A|
2:1<=x<=y<=|B|
3:A(i,j)=B(x,y)
4:A(i,j)是回文串
这里表示字符串A的长度。
JYY希望你帮助他计算出这两个朋友之间关系的紧密程度。
Solution
把两个串插入到同一个回文自动机里面 , 记录每一个回文串中两个字符串出现的次数 size[0/1].
相乘就是一组回文串的贡献 , 答案就是 ∑size[i][0]∗size[i][1]
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int nxt[N][26],fa[N],len[N],p=0,n,cnt=-1,sz[N][2],T=0;char s[N];
inline int newnode(int x){len[++cnt]=x;return cnt;}
inline void init(){newnode(0),newnode(-1),fa[0]=1;}
inline int fail(int x,int n){
while(s[n]!=s[n-len[x]-1])x=fa[x];
return x;
}
inline void ins(int c,int n){
int x=fail(p,n),t;
if(!nxt[x][c]){
t=newnode(len[x]+2);
fa[t]=nxt[fail(fa[x],n)][c],nxt[x][c]=t;
}
p=nxt[x][c],sz[p][T]++;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%s",s+1),n=strlen(s+1);
T=0,init();
for(int i=1;i<=n;i++)ins(s[i]-'A',i);
scanf("%s",s+1),T=1,n=strlen(s+1),p=0;
for(int i=1;i<=n;i++)ins(s[i]-'A',i);
long long ans=0;
for(int i=cnt;i>=2;i--){
for(int j=0;j<2;j++)sz[fa[i]][j]+=sz[i][j];
ans+=1ll*sz[i][0]*sz[i][1];
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
2017-07-14 [POJ2406]字符串的幂
2017-07-14 [SPOJ705]不同的子串
2017-07-14 [USACO Dec06]产奶的模式
2017-07-14 [USACO 5.1.3]乐曲主题