4566: [Haoi2016]找相同字符

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 1212  Solved: 694
[Submit][Status][Discuss]

Description

给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两
个子串中有一个位置不同。

Input

两行,两个字符串s1,s2,长度分别为n1,n2。1 <=n1, n2<= 200000,字符串中只有小写字母

Output

输出一个整数表示答案

Sample Input

aabb
bbaa

Sample Output

10

HINT

 

Source

时隔许久后重新获得了后缀自动机技能。

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define maxn 200005
#define ll long long
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
struct SUF {
int sz[maxn*],link[maxn*],step[maxn*],son[maxn*][],v[maxn*],pos[maxn*];
int nxt[maxn*],head[maxn*],tto[maxn*],tot;
int cnt,last;
SUF() {last=cnt=;memset(head,-,sizeof(head));}
void extend(int c) {
int p=last,np=last=++cnt;step[np]=step[p]+;sz[np]=;
while(p&&!son[p][c]) son[p][c]=np,p=link[p];
if(!p) link[np]=;
else {
int q=son[p][c];
if(step[q]==step[p]+) link[np]=q;
else {
int nq=++cnt;
memcpy(son[nq],son[q],sizeof(son[q]));
link[nq]=link[q];link[q]=link[np]=nq;
step[nq]=step[p]+;
while(son[p][c]==q&&p) son[p][c]=nq,p=link[p];
}
}
}
void pre() {
for(int i=;i<=cnt;i++) v[step[i]]++;
for(int i=;i<=cnt;i++) v[i]+=v[i-];
for(int i=cnt;i>=;i--) pos[v[step[i]]--]=i;
for(int i=cnt;i>=;i--) sz[link[pos[i]]]+=sz[pos[i]];
}
ll f[maxn*];
void dfs(int x) {
f[x]+=1ll*sz[x]*(step[x]-step[link[x]]);
for(int i=head[x];i>=;i=nxt[i]) {
int to=tto[i];f[to]+=f[x];dfs(to);
}
}
void add(int u,int v) {
nxt[tot]=head[u];tto[tot]=v;head[u]=tot++;
}
}t;
char ch[maxn];
int main() {
scanf("%s",ch+);int len=strlen(ch+);
for(int i=;i<=len;i++) t.extend(ch[i]-'a');
t.pre();
scanf("%s",ch+);len=strlen(ch+);
for(int i=;i<=t.cnt;i++) if(t.link[i]) t.add(t.link[i],i);t.dfs();
int now=,l=;ll ans=;
for(int i=;i<=len;i++) {
int to=ch[i]-'a';
while(now&&!t.son[now][to]) now=t.link[now];
if(!now) now=,l=;
else l=min(l,t.step[now])+,now=t.son[now][to];
ans+=t.f[t.link[now]];ans+=1ll*(l-t.step[t.link[now]])*t.sz[now];
}
printf("%lld\n",ans);
}

[BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp的更多相关文章

  1. BZOJ4566: [Haoi2016]找相同字符(后缀自动机)

    题意 题目链接 Sol 直接在SAM上乱搞 枚举前缀,用SAM统计可以匹配的后缀,具体在匹配的时候维护和当前节点能匹配的最大值 然后再把parent树上的点的贡献也统计上,这部分可以爆跳parent树 ...

  2. BZOJ 4566: [Haoi2016]找相同字符 [后缀自动机]

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 275  Solved: 155[Submit][Statu ...

  3. HAOI2016 找相同字符 后缀自动机

    两个串,考虑一建一跑.枚举模式串的位置\(i\),考虑每次统计以\(i\)结尾的所有符合要求的串.在后缀自动机上走时记录当前匹配长度\(curlen\),则当前节点的贡献是\((curlen-len[ ...

  4. BZOJ4566 [Haoi2016]找相同字符【SAM】

    BZOJ4566 [Haoi2016]找相同字符 给定两个字符串\(s和t\),要求找出两个字符串中所有可以相互匹配的子串对的数量 首先考虑可以怎么做,我们可以枚举\(t\)串的前缀\(t'\),然后 ...

  5. [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 861  Solved: 495[Submit][Statu ...

  6. 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈

    [BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...

  7. [HAOI2016] 找相同字符 - 后缀数组,单调栈

    [HAOI2016] 找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. \(n,m \l ...

  8. BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  9. [HAOI2016]找相同字符(SAM+DP)

    感觉很水. 因为SAM上一个点的子树大小代表这个点所表示子串的出现次数. 建出广义后缀自动机之后.在\(parent\)树上跑\(DP\),维护\(size[i][1]\),和\(size[i][0] ...

随机推荐

  1. MyEclipse安装FreeMarker插件

      MyEclipce8.6中安装FreeMarker插件,这绝对是最简单的方法.   步骤如下:   (一)打开http://sourceforge.net/projects/freemarker- ...

  2. HDU 4549 矩阵快速幂+快速幂+欧拉函数

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  3. HDU1832 二维线段树求最值(模板)

    Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. Nginx安装(官网翻译)

    转载自:https://www.nginx.com/resources/wiki/start/topics/tutorials/install/ 二进制版本预包装的Linux和BSD大多数Linux发 ...

  5. SoC时钟系统简介

    1.SoC的时钟获得一般有: * 外部直接输入时钟信号,SoC有个引脚用来输入外部时钟信号,用的很少. * 外部晶振+内部时钟发生器产生时钟,大部分低频单片机都是这么工作的. * 外部晶振+内部时钟发 ...

  6. 解决Sublime Install Package的There are no packages available for install问题(channel_v3.json)

    Sublime版本 Sublime Text 3.1.1 Build 3176 自己也尝试了很多次,所以这一解决办法仅是可能解决你的问题 一.解决简要描述 造成的原因大致是 无法通过request去获 ...

  7. 两小时快速构建微信小程序

    小程序在2017年1月上线之初,被社会极力吹捧,刻意去将其制造为一个“风口”,透支其价值.但是在之后一个月里,石破天惊迅速归为沉寂.媒体又开始过度消费小程序,大谈其鸡肋之处. 个人认为小程序的一个分水 ...

  8. 2008 APAC local onsites C Millionaire (动态规划,离散化思想)

    Problem You have been invited to the popular TV show "Would you like to be a millionaire?" ...

  9. HDU 1175 连连看 (深搜+剪枝)

    题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...

  10. charles https抓包

    1. 配置 Charles 根证书 首先打开 Charles: Charles 启动界面 主界面 然后如下图操作:   之后会弹出钥匙串,如果不弹出,请自行打开钥匙串,如下图: 钥匙串 系统默认是不信 ...