[bzoj 4566][Haoi 2016]找相同字符
传送门
Description
给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两个子串中有一个位置不同。
Solution
考虑用SAM,采用较为轻松的姿势
首先中加个特殊符号,把连个字符串接在一起
SAM的每个节点都存下了一些子串,我们分别记下它在\(s_1\)和\(s_2\)中出现的次数
那么每个状态它给答案的贡献是
\[(step[i]-step[fa[i]]) × siz_{s_1}[i]×siz_{s_2}[i]
\]
Code
//2019.1.25 23:00~23:18
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define MN 200005
char s[MN];
class SAM
{
#define MX 800005
private:
int last,cnt,fa[MX],v[MX],rk[MX],val[MX][2],c[MX][27],step[MX];ll ans;
public:
SAM(int _=1):last(_),cnt(_){}
inline void Insert(int x,bool pos)
{
int p=last,np=++cnt;step[np]=step[p]+1;val[np][pos]=1;
for(;p&&!c[p][x];p=fa[p]) c[p][x]=np;
if(!p) fa[np]=1;
else
{
int q=c[p][x];
if(step[q]==step[p]+1) fa[np]=q;
else
{
int nq=++cnt;
fa[nq]=fa[q];fa[np]=fa[q]=nq;
memcpy(c[nq],c[q],sizeof c[nq]);
step[nq]=step[p]+1;
for(;c[p][x]==q;p=fa[p]) c[p][x]=nq;
}
}
last=np;
}
inline void Query()
{
register int i;
for(i=1;i<=cnt;++i) ++v[step[i]];
for(i=1;i<=step[last];++i) v[i]+=v[i-1];
for(i=1;i<=cnt;++i) rk[v[step[i]]--]=i;
for(i=cnt;i;--i)
{
val[fa[rk[i]]][0]+=val[rk[i]][0];
val[fa[rk[i]]][1]+=val[rk[i]][1];
ans+=1ll*val[rk[i]][0]*val[rk[i]][1]*(step[rk[i]]-step[fa[rk[i]]]);
}
val[1][0]=val[1][1]=0;
printf("%lld\n",ans);
}
}pac;
int main()
{
scanf("%s",s+1);
register int n=strlen(s+1),i;
for(i=1;i<=n;++i) pac.Insert(s[i]-'a',0);
pac.Insert(26,0);
scanf("%s",s+1);n=strlen(s+1);
for(i=1;i<=n;++i) pac.Insert(s[i]-'a',1);
pac.Query();
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
[bzoj 4566][Haoi 2016]找相同字符的更多相关文章
- [HAOI 2016]找相同字符
Description 题库链接 给定两个只含小写字母字符串 \(s_1,s_2\) ,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. \ ...
- BZOJ 4566: [Haoi2016]找相同字符 [后缀自动机]
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 275 Solved: 155[Submit][Statu ...
- bzoj 4566 [Haoi2016]找相同字符SA
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 128 Solved: 75[Submit][Status ...
- BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机)
BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机) 题面 自己找去 HINT 给定两个文本串,问从两个串中各取一个非空子串,使这俩子串相同,问方案有多少种.我的思路 ...
- 【BZOJ4566】找相同字符(后缀数组)
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...
- 【BZOJ4566】找相同字符(后缀自动机)
[BZOJ4566]找相同字符(后缀自动机) 题面 BZOJ 题解 看到多串处理,\(SA\)就连起来 \(SAM???\) 单串建自动机 然后其他串匹配 对于一个串建完\(SAM\)后 另一个串在\ ...
- [BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1212 Solved: 694[Submit][Stat ...
- [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 861 Solved: 495[Submit][Statu ...
- [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...
随机推荐
- C#倒计时关闭提示框
前两天实现某个功能需要做一个提示框 并且能够自动关闭的,就从网上搜了一个能够自动关闭的提示框 ,但由于我需要的场景是不确定计时时间的,所以并没有使用到该窗体,但是我觉得可以留存备用 ,后边也把我 这种 ...
- C++复制构造函数,类型转换构造函数,析构函数,引用,指针常量和常量指针
复制构造函数形如className :: className(const &) / className :: className(const className &)后者能以常 ...
- vue的事件对象
事件对象: v-on:click/mouseover 简写: @click="" @click="show($event)" <input t ...
- VIO的一些随笔
大公司跑在手机的似乎都是滤波MSCKF那种,有优化的但似乎功耗不行.还有就是杂交的前端滤波后面在挂地图,反正国内的似乎就是SVO, VINS, ORBSLAM,MSCKF组合起来. 缺啥补啥,那个太烂 ...
- MACOS 安装mysqlclient 的 Library not loaded错误
报错场景 >>> import MySQLdb Traceback (most recent call last): File "<stdin>", ...
- 删除MRP单据
select *into newtable from a_mplist 把a_mplist的表中的数据复制到newtable表中结构也是一样的 insert into newtable select ...
- 【坑】select2 模态框中下拉input无法focus
select2的组件bug 解决方案: 在bootstrap.js中修改: Modal.prototype.enforceFocus = function () { $(document) .off( ...
- C# - 配置动态更新
生产中经常会遇到修改配置的情况,但是又需要重启应用程序,是不是有点小烦躁.... 下面了解下在不重启情况下,实现配置更新实时生效 public static void SetConfig(string ...
- LVS工作原理及集群类型
Cluster概念 Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统 Linux Cluster类型: LB:Load Balancing,负载均衡 HA:High ...
- STM32复位及通过函数判断是何种条件出发的复位
STM32F10xxx支持三种复位形式,分别为系统复位.上电复位和备份区域复位. 一.系统复位: 系统复位将复位所有寄存器至它们的复位状态. 当发生以下任一事件时,产生一个系统复位: 1. NRST引 ...