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希望你帮助他计算出这两个朋友之间关系的紧密程度。
Input

数据包行两行由大写字母组成的字符串A和B
1≤|A|,|B|≤50000。

Output

包含一行一个整数,表示紧密程度,也就是满足要求的4元组个数


题解:
感觉回文自动机的题比AC自动机和SAM友好多了(

其实只需要知道A,B串中有多少对相同的回文串就好了,由于回文自动机上的结点代表的回文串都是唯一的,所以我们可以分别建回文自动机,然后求出每个回文串的出现次数,同时dfs奇根和偶根,出现次数相乘然后累加即可


AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define LL long long
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
const int MAXN = 5e5+50;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
char s[MAXN],t[MAXN];
struct PAM{int nxt[MAXN][26],fail[MAXN],cnt[MAXN],len[MAXN];int tot,last;inline void Init(){len[0]=0,len[1]=-1;fail[0]=fail[1]=1;last=0,tot=1;}inline void Insert(int x,int en,char *s){int rt=last;while(s[en]!=s[en-len[rt]-1]) rt=fail[rt];if(!nxt[rt][x]){int tmp=fail[rt]; ++tot;while(s[en]!=s[en-len[tmp]-1]) tmp=fail[tmp];fail[tot]=nxt[tmp][x];nxt[rt][x]=tot;len[tot]=len[rt]+2;}last = nxt[rt][x]; cnt[last]++;}inline void solve(){for(int i=tot;i;i--) cnt[fail[i]] += cnt[i];}
}p1,p2;
LL ans;
void dfs(int u,int v){if(u>1 && v>1) ans+=1LL*p1.cnt[u]*p2.cnt[v];for(int i=0;i<26;i++)if(p1.nxt[u][i] && p2.nxt[v][i])dfs(p1.nxt[u][i],p2.nxt[v][i]);
}
signed main(){#ifndef ONLINE_JUDGEfreopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGEp1.Init(); p2.Init();cin>>(s+1)>>(t+1);int n=strlen(s+1),m=strlen(t+1);for(int i=1;i<=n;i++) p1.Insert(s[i]-'A',i,s);for(int i=1;i<=m;i++) p2.Insert(t[i]-'A',i,t);p1.solve(); p2.solve();dfs(1,1); dfs(0,0); cout<<ans<<'\n';return 0;
}

BZOJ 4480: [Jsoi2013]快乐的jyy(回文自动机)相关推荐

  1. BZOJ 4480 [JSOI2013] 快乐的jyy

    思路 两个字符串都插入回文自动机中(每次重置last) 最后统计两个right集合的大小就好了 代码 #include <cstdio> #include <algorithm> ...

  2. bzoj 4480: [Jsoi2013]快乐的jyy

    题意: 给两个串,求两个相同的回文串,在两个串中出现过,位置不同算不同.求方案数. 题解: 回文自动机裸题,当然bzoj3676更裸,记得有一篇博客写的很好,关于回文自动机的,但是忘了是哪篇,好像从h ...

  3. 4480: [Jsoi2013]快乐的jyy

    给定两个字符串A和B,表示JYY的两个朋友的名字.我们用A(i,j)表示A 字符串中从第i个字母到第j个字母所组成的子串.同样的,我们也可以定义B(x,y). JYY发现两个朋友关系的紧密程度,等于同 ...

  4. Bzoj4480: [Jsoi2013]快乐的jyy 广义后缀自动机 倍增 哈希 manacher

    国际惯例的题面: 有人说这是回文自动机的板子题,然而我是不会这种东西的. 于是,我选择用更一般性的方法去解决这个题,就是那一堆东西了. 首先,我们把两个串同时插入一个广义SAM里,拓扑排序维护每个节点 ...

  5. BZOJ4480:快乐的jyy(回文自动机)

    题面 题意:给出两个串,问所有回文串在两个串出现次数之积之和. 应该是回文自动机果题 插完一个串后重置last,再插入另一个串 每个状态对于两个串分别统计Right集的大小 就可以统计答案了 #inc ...

  6. BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

  7. BZOJ 2342: 【SHOI2011】 双倍回文

    题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个"双倍回文",当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\) ...

  8. [JSOI2013]快乐的 JYY

    一.题目 点此看题 二.解法 回文自动机板题,我们先建出两个回文自动机,把每一次的LastLastLast打上标记,然后再对failfailfail树内的标记求和,算出来就是这个点的回文串出现次数.然 ...

  9. BZOJ4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

最新文章

  1. php中使用Curl、socket、file_get_contents三种方法POST提交数据
  2. 一文了解树在前端中的应用,掌握数据结构中树的生命线
  3. 斑马打印机怎么打印二维码_万能打印机厂家是怎么改良打印机的?
  4. windows eclipse python环境搭建
  5. 自己动手写Docker系列 -- 4.3实现volume数据卷
  6. 白山搜索引擎优化收费_在网络推广中,SEO排名优化是成本最低的方式
  7. Oracle集群(RAC)及 jdbc 连接双机数据库
  8. python模块的分类有哪些_整理了一份清单,常见Python问题的快速解答包
  9. 支持IE8的文件上传
  10. python概率分析_请问如何通过Python做R*C列表的Fisher确切概率分析?
  11. PMP-专家判断、类比估算、参数估算、三点估算、自下而上估算、独立估算的区别
  12. 数据分布度的度量Measures of Spread
  13. U3D开发的逆天级大型游戏有哪些
  14. 端午节之苍南懒人游 (*^__^*) ……
  15. MFC 菜单栏添加方法
  16. Microsoft OneNote for MacOS 输入中英文字体自动改变
  17. 北斗导航 | 北斗/GNSS相关数据下载:IGS/IGMAS/MGEX/DCB/brdc/gamit/bernese/rinex等
  18. 复现ReDet RTX 3090 pytorch1.8.1
  19. Windows11 hosts 文件无法修改怎么办?
  20. 洗地机性价比高的是哪款?性价比高适合入手的洗地机介绍

热门文章

  1. visual studio 创建 dll 文件
  2. 计算机网络原理2020年8,2020年自考计算机网络原理考前资料
  3. 推送开发实战:APP如何实现跟随用户不同场景,实现不同的内容推荐
  4. 【R的机器学习】决策树性能提升
  5. 高精定位模块(LMU)
  6. 一个月SRC挖洞之旅总结
  7. 单片机 架构 程序 经验总结_avr单片机工作经验总结
  8. sql按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
  9. CSharp中Socket网络编程(六)UDP协议编程
  10. 百练_4019:黑色星期五