题面

Bzoj

Sol

两个串拼在一起后求出后缀数组
然后显然的\(n^2\)暴力,就是直接枚举求\(LCP\)
又由于扫的时候是对\(height\)取\(min\)
那么可以用单调栈维护每一段的贡献相同的

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(4e5 + 5);int n, a[_], is[_], rk[_], sa[_], height[_], tmp[_], t[_];
int S[_], top, s1[_], s2[_];
ll ans, sum[_];
char ss[_];IL int Cmp(RG int i, RG int j, RG int k){return tmp[i] == tmp[j] && tmp[i + k] == tmp[j + k] && i + k <= n && j + k <= n;
}IL void Suffix_Sort(){RG int m = 27;for(RG int i = 1; i <= n; ++i) ++t[rk[i] = a[i]];for(RG int i = 1; i <= m; ++i) t[i] += t[i - 1];for(RG int i = n; i; --i) sa[t[rk[i]]--] = i;for(RG int k = 1; k <= n; k <<= 1){RG int l = 0;for(RG int i = n - k + 1; i <= n; ++i) tmp[++l] = i;for(RG int i = 1; i <= n; ++i) if(sa[i] > k) tmp[++l] = sa[i] - k;for(RG int i = 0; i <= m; ++i) t[i] = 0;for(RG int i = 1; i <= n; ++i) ++t[rk[tmp[i]]];for(RG int i = 1; i <= m; ++i) t[i] += t[i - 1];for(RG int i = n; i; --i) sa[t[rk[tmp[i]]]--] = tmp[i];swap(rk, tmp), rk[sa[1]] = l = 1;for(RG int i = 2; i <= n; ++i) rk[sa[i]] = Cmp(sa[i - 1], sa[i], k) ? l : ++l;if(l >= n) break;m = l;}for(RG int i = 1, h = 0; i <= n; ++i){if(h) --h;while(a[i + h] == a[sa[rk[i] - 1] + h]) ++h;height[rk[i]] = h;}
}int main(RG int argc, RG char* argv[]){scanf(" %s", ss);for(RG int i = 0, len = strlen(ss); i < len; ++i) a[++n] = ss[i] - 'a' + 1, is[n] = 1;scanf(" %s", ss), a[++n] = 27;for(RG int i = 0, len = strlen(ss); i < len; ++i) a[++n] = ss[i] - 'a' + 1, is[n] = 2;Suffix_Sort();for(RG int i = 1; i < n; ++i)s1[i] = s1[i - 1] + (is[sa[i]] == 1), s2[i] = s2[i - 1] + (is[sa[i]] == 2);S[0] = 1;for(RG int i = 1; i < n; ++i){while(top && height[S[top]] > height[i]) --top;S[++top] = i, sum[top] = sum[top - 1] + (s1[i - 1] - s1[S[top - 1] - 1]) * height[i];if(is[sa[i]] == 2) ans += sum[top];}top = 0;for(RG int i = 1; i < n; ++i){while(top && height[S[top]] > height[i]) --top;S[++top] = i, sum[top] = sum[top - 1] + (s2[i - 1] - s2[S[top - 1] - 1]) * height[i];if(is[sa[i]] == 1) ans += sum[top];}printf("%lld\n", ans);return 0;
}

转载于:https://www.cnblogs.com/cjoieryl/p/8457460.html

Bzoj4566:[HAOI2016]找相同字符相关推荐

  1. BZOJ4566: [Haoi2016]找相同字符

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

  2. [bzoj4566][HAOI2016]找相同字符

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 113 Solved: 64 [Submit][Status ...

  3. [bzoj4566][HAOI2016]找相同字符(后缀数组)

    题目 传送门 题解 这里:把两个串用一个很大的字符连接起来,求一个后缀数组. 考虑怎样暴力的算答案. 在 rank  r a n k rank数组中从前往后枚举起点,对于每个枚举的起点,都暴力的往后扫 ...

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

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

  5. [BZOJ4566][HAOI2016]找相同字符 后缀自动机

    题目要求的就是B的每个字串在A中的出现次数之和. 我们考虑先建出A串的SAM,每个点所代表的串的个数就是 |Righti|∗(Maxi−Maxfai) |Right_i|*(Max_i-Max_{fa ...

  6. [洛谷P3181] [HAOI2016]找相同字符

    洛谷题目链接:[HAOI2016]找相同字符 题目描述 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式 输入 ...

  7. 【HAOI2016/BZOJ4566】找相同字符 后缀数组+单调栈

    原题走这里 鉴于我实在不是很懂单调栈和单调队列这一系列东西,所以我决定稍微具体讲一下单调栈. 恩,本题实质上就是求两个字符串的公共子串数,其中只要出现位置不同,就算是不同的子串. 处理多个字符串的经典 ...

  8. 【bzoj4566】[Haoi2016]找相同字符【后缀自动机】

    题目传送门 题解:在文本串上建后缀自动机,用模式串在后缀自动机上跑.扫一遍模式串,在后缀自动机上走,走不了就跳fail再走. 走的过程中,维护模式串与文本串匹配的最大长度,并且统计答案. 怎么统计答案 ...

  9. 4566: [Haoi2016]找相同字符 SAM

    折腾了好久.不过收获还是很多的.第一次自己去画SAM所建出来fail树.深入体会了这棵树的神奇性质. 当然,我最终靠着自己A掉了.(这是我第一次推SAM的性质(以前都是抄别人的,感觉自己好可耻),不过 ...

最新文章

  1. Directx教程(24) 简单的光照模型(3)
  2. 【剑指offer】设置在最小数目的阵列
  3. DC-leetcode215数组中的第k大元素
  4. vs2010连接mongodb服务器,X64位
  5. 台湾大学林轩田机器学习技法课程学习笔记16(完结) -- Finale
  6. hibernate 双向一对多 关联在多端维护
  7. 【C++grammar】继承与构造test1代码附录
  8. Java中implies_boolean implies(Permission p)
  9. 爬虫-古试词网验证码手工打码访问登陆后页面
  10. 一个学单片机的不错网站
  11. python语言的开发者_写给.NET开发者的Python教程(一):引言
  12. CIO:节省IT部门开支十招
  13. rose 生产java代码m_rose 生成代码
  14. 惠普服务器做虚拟化,节省成本立竿见影 惠普虚拟化技术详解
  15. astc纹理压缩格式
  16. [OpenCV实战]23 使用OpenCV获取高动态范围成像HDR
  17. EM算法 --入门级详解
  18. 详解one—hot编码(独热编码)
  19. MAML:Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks论文精读及详解
  20. 常用软件CD-KEY

热门文章

  1. React navtive
  2. Flume-0.9.4数据插入HBase-0.96
  3. 正则表达式限制输入整数或小数
  4. Spring AOP与IOC
  5. Linux常用命令手册
  6. C语言的内联函数的作用
  7. OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤
  8. opencv图像旋转
  9. 小插件 打开Android程序动画,android-单击小部件后如何启动活动?
  10. Php将网站推送到手机桌面的方法,把网页发送到桌面代码