bzoj 4566 [Haoi2016]找相同字符SA
4566: [Haoi2016]找相同字符
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 128 Solved: 75
[Submit][Status][Discuss]
Description
Input
两行,两个字符串s1,s2,长度分别为n1,n2。1 <=n1, n2<= 200000,字符串中只有小写字母
Output
输出一个整数表示答案
Sample Input
bbaa
Sample Output
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio> #define ll long long
#define N 200007
using namespace std; int n,fa[N];
int cnta[N<<],cntb[N<<],sa[N<<],rk[N<<],a[N<<],b[N<<],tsa[N<<],height[N<<],g[N<<],f[N<<],A[N<<],B[N<<];
char s1[N],s2[N],s[N*]; void Get_SA()
{
for (int i=;i<=;i++)cnta[i]=;
for (int i=;i<=n;i++)cnta[(int)s[i]]++;
for (int i=;i<=;i++)cnta[i]+=cnta[i-];
for (int i=n;i>=;i--)sa[cnta[(int)s[i]]--]=i;
rk[sa[]]=;
for (int i=;i<=n;i++)rk[sa[i]]=rk[sa[i-]]+(s[sa[i]]!=s[sa[i-]]);
for (int i=;rk[sa[n]]!=n;i<<=)
{
for (int j=;j<=n;j++)a[j]=rk[j],b[j]=rk[j+i];
for (int j=;j<=n;j++)cnta[j]=cntb[j]=;
for (int j=;j<=n;j++)cnta[a[j]]++,cntb[b[j]]++;
for (int j=;j<=n;j++)cnta[j]+=cnta[j-],cntb[j]+=cntb[j-];
for (int j=n;j>=;j--)tsa[cntb[b[j]]--]=j;
for (int j=n;j>=;j--)sa[cnta[a[tsa[j]]]--]=tsa[j];
rk[sa[]]=;
for (int j=;j<=n;j++)
rk[sa[j]]=rk[sa[j-]]+(a[sa[j]]!=a[sa[j-]]||b[sa[j]]!=b[sa[j-]]);
}
}
void Get_Height()
{
int len=;
for (int i=;i<=n;i++)
{
if (len)len--;
while(s[i+len]==s[sa[rk[i]-]+len])len++;
height[rk[i]]=len;
}
}
bool cmp(int x,int y){return height[x]>height[y];}
int find(int x)
{
if (f[x]!=x)f[x]=find(f[x]);
return f[x];
}
int main()
{
scanf("%s",s1+);int len1=strlen(s1+);
scanf("%s",s2+);int len2=strlen(s2+);
n=len1+len2+;
for (int i=;i<=n;i++)
if (i==len1+){s[i]=(char);continue;}
else s[i]=(i<=len1)?s1[i]-'a'+:s2[i-len1-]-'a'+;
Get_SA();
Get_Height();
/*for (int i=1;i<=n;i++)
cout<<height[i]<<" ";
cout<<endl;*/
for (int i=;i<=n;i++)
{
g[i]=i+;
f[i]=i;
if (sa[i]<=len1)A[i]=;
if (sa[i]>len1+)B[i]=;
}
sort(g+,g+n,cmp);
ll ans=;
for (int i=;i<=n-;i++)
{
int x=find(g[i]),y=find(g[i]-);
ans+=((ll)A[y]*B[x]+(ll)A[x]*B[y])*height[g[i]];
A[y]+=A[x],B[y]+=B[x];
f[x]=y;
}
printf("%lld",ans);
}
bzoj 4566 [Haoi2016]找相同字符SA的更多相关文章
- BZOJ 4566: [Haoi2016]找相同字符 [后缀自动机]
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 275 Solved: 155[Submit][Statu ...
- 【刷题】BZOJ 4566 [Haoi2016]找相同字符
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为 ...
- bzoj 4566: [Haoi2016]找相同字符
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...
- ●BZOJ 4566 [Haoi2016]找相同字符
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4566题解: 广义后缀自动机 对两个串同时建立一个广义后缀自动机. 同时统计出每个状态对两个串 ...
- BZOJ.4566.[HAOI2016]找相同字符(后缀数组 单调栈)
题目链接 给定两个字符串,求它们有多少个相同子串.相同串的位置不同算多个. POJ3145简化版. 后缀自动机做法见这儿,又快又好写(一下就看出差距了..) //13712kb 4076ms #inc ...
- bzoj 4566 [Haoi2016]找相同字符——广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 每个后缀结尾处 ct[ ] = 1 ,按拓扑序 dp 一下就能求出 right 集合的 ...
- BZOJ 4566 [Haoi2016]找相同字符 ——广义后缀自动机
建立广义后缀自动机. 然后统计子树中的siz,需要分开统计 然后对(l[i]-l[fa[i]])*siz[i][0]*siz[i][1]求和即可. #include <cstdio> #i ...
- [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 861 Solved: 495[Submit][Statu ...
- [BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1212 Solved: 694[Submit][Stat ...
随机推荐
- 剑指offer58 二叉树的下一个结点
自己写的 class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode == NULL) return ...
- 10分钟搞懂toString和valueOf函数(详细版)
首先要说明的是这两种方法是toPrimitive抽象操作里会经常用到的. 默认情况下,执行这个抽象操作时会先执行valueOf方法,如果返回的不是原始值,会继续执行toString方法,如果返回的还不 ...
- JavaScript -- 内置对象字符串
charAt和charCodeAt charAt语法: stringObject.charAt(index) 功能: 返回stringObject中index位置的字符. charCodeAt语法 s ...
- Mybatis学习记录(2)
1.mybatis与hibernate不同 Mybatis和hibernate,mybatis不完全是一个ORM框架,因为Mybatis需要程序员自己编写sql语句.mybatis可以通过xml或注解 ...
- sessionStorage对象
sessStorage对象是一个会话形式的数据存储,当用户关闭浏览器的窗口后,数据就会被删除. 实例: <!DOCTYPE html><html><head> &l ...
- IDEA 官方背景与修改jsp模板以及字体大小
一.官方背景切换 方法一:先打开file找到Settings 如图: 也可以用快捷方式打开:Ctrl+alt+s 打开 找到Editor点击进入 ,再然后找Color Scheme 可以看到如下图 ...
- 在Linux下安装redis
http://www.cnblogs.com/xiaohongxin/p/6854095.html 追加: 通过配置文件启动最好先./redis.cli shutdown ,再到当前目录在./redi ...
- 反射中 invoke方法 getMethod方法 getClass()方法
package com.swift; import java.util.*; import java.lang.reflect.*; public class ReflectDemo { public ...
- 【数论分块】bzoj2956: 模积和
数论分块并不精通……第一次调了一个多小时才搞到60pts:因为不会处理i==j的情况,只能枚举了…… Description $\sum_{i=1}^{n}\sum_{j=1 \land i \not ...
- 17.Yii2.0框架模型添加记录
目录 新建控制器 HomeController.php 新建model Article.php 新建控制器 HomeController.php D:\xampp\htdocs\yii\control ...