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希望你帮助他计算出这两个朋友之间关系的紧密程度。
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(回文自动机)相关推荐
- BZOJ 4480 [JSOI2013] 快乐的jyy
思路 两个字符串都插入回文自动机中(每次重置last) 最后统计两个right集合的大小就好了 代码 #include <cstdio> #include <algorithm> ...
- bzoj 4480: [Jsoi2013]快乐的jyy
题意: 给两个串,求两个相同的回文串,在两个串中出现过,位置不同算不同.求方案数. 题解: 回文自动机裸题,当然bzoj3676更裸,记得有一篇博客写的很好,关于回文自动机的,但是忘了是哪篇,好像从h ...
- 4480: [Jsoi2013]快乐的jyy
给定两个字符串A和B,表示JYY的两个朋友的名字.我们用A(i,j)表示A 字符串中从第i个字母到第j个字母所组成的子串.同样的,我们也可以定义B(x,y). JYY发现两个朋友关系的紧密程度,等于同 ...
- Bzoj4480: [Jsoi2013]快乐的jyy 广义后缀自动机 倍增 哈希 manacher
国际惯例的题面: 有人说这是回文自动机的板子题,然而我是不会这种东西的. 于是,我选择用更一般性的方法去解决这个题,就是那一堆东西了. 首先,我们把两个串同时插入一个广义SAM里,拓扑排序维护每个节点 ...
- BZOJ4480:快乐的jyy(回文自动机)
题面 题意:给出两个串,问所有回文串在两个串出现次数之积之和. 应该是回文自动机果题 插完一个串后重置last,再插入另一个串 每个状态对于两个串分别统计Right集的大小 就可以统计答案了 #inc ...
- BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...
- BZOJ 2342: 【SHOI2011】 双倍回文
题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个"双倍回文",当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\) ...
- [JSOI2013]快乐的 JYY
一.题目 点此看题 二.解法 回文自动机板题,我们先建出两个回文自动机,把每一次的LastLastLast打上标记,然后再对failfailfail树内的标记求和,算出来就是这个点的回文串出现次数.然 ...
- BZOJ4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...
最新文章
- php中使用Curl、socket、file_get_contents三种方法POST提交数据
- 一文了解树在前端中的应用,掌握数据结构中树的生命线
- 斑马打印机怎么打印二维码_万能打印机厂家是怎么改良打印机的?
- windows eclipse python环境搭建
- 自己动手写Docker系列 -- 4.3实现volume数据卷
- 白山搜索引擎优化收费_在网络推广中,SEO排名优化是成本最低的方式
- Oracle集群(RAC)及 jdbc 连接双机数据库
- python模块的分类有哪些_整理了一份清单,常见Python问题的快速解答包
- 支持IE8的文件上传
- python概率分析_请问如何通过Python做R*C列表的Fisher确切概率分析?
- PMP-专家判断、类比估算、参数估算、三点估算、自下而上估算、独立估算的区别
- 数据分布度的度量Measures of Spread
- U3D开发的逆天级大型游戏有哪些
- 端午节之苍南懒人游 (*^__^*) ……
- MFC 菜单栏添加方法
- Microsoft OneNote for MacOS 输入中英文字体自动改变
- 北斗导航 | 北斗/GNSS相关数据下载:IGS/IGMAS/MGEX/DCB/brdc/gamit/bernese/rinex等
- 复现ReDet RTX 3090 pytorch1.8.1
- Windows11 hosts 文件无法修改怎么办?
- 洗地机性价比高的是哪款?性价比高适合入手的洗地机介绍