bzoj4566 找相同字符
题意:给定两个字符串,从中各取一个子串使之相同,有多少种取法。允许本质相同。
解:建立广义后缀自动机,对于每个串,分别统计cnt,之后每个点的cnt乘起来。记得开long long
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- typedef long long LL;
- const int N = ;
- struct Edge {
- int nex, v;
- }edge[N << ]; int top;
- int tr[N][], len[N], fail[N], cnt[N][], vis[N];
- int tot = , last, turn, e[N];
- char s[N], str[N];
- inline void add(int x, int y) {
- top++;
- edge[top].v = y;
- edge[top].nex = e[x];
- e[x] = top;
- return;
- }
- inline int split(int p, int f) {
- int Q = tr[p][f], nQ = ++tot;
- len[nQ] = len[p] + ;
- fail[nQ] = fail[Q];
- fail[Q] = nQ;
- memcpy(tr[nQ], tr[Q], sizeof(tr[Q]));
- while(tr[p][f] == Q) {
- tr[p][f] = nQ;
- p = fail[p];
- }
- return nQ;
- }
- inline int insert(int p, char c) {
- int f = c - 'a';
- if(tr[p][f]) {
- int Q = tr[p][f];
- if(len[Q] == len[p] + ) {
- cnt[Q][turn] = ;
- return Q;
- }
- int t = split(p, f);
- cnt[t][turn] = ;
- return t;
- }
- int np = ++tot;
- len[np] = len[p] + ;
- cnt[np][turn] = ;
- while(p && !tr[p][f]) {
- tr[p][f] = np;
- p = fail[p];
- }
- if(!p) {
- fail[np] = ;
- }
- else {
- int Q = tr[p][f];
- if(len[Q] == len[p] + ) {
- fail[np] = Q;
- }
- else {
- fail[np] = split(p, f);
- }
- }
- return np;
- }
- void DFS(int x) {
- for(int i = e[x]; i; i = edge[i].nex) {
- int y = edge[i].v;
- DFS(y);
- cnt[x][] += cnt[y][];
- cnt[x][] += cnt[y][];
- }
- return;
- }
- int main() {
- scanf("%s%s", s, str);
- int n = strlen(s), last = ;
- for(int i = ; i < n; i++) {
- last = insert(last, s[i]);
- }
- n = strlen(str);
- last = turn = ;
- for(int i = ; i < n; i++) {
- last = insert(last, str[i]);
- }
- for(int i = ; i <= tot; i++) {
- add(fail[i], i);
- }
- DFS();
- int p = ;
- LL ans = ;
- for(int i = ; i <= tot; i++) {
- ans += 1ll * cnt[i][] * cnt[i][] * (len[i] - len[fail[i]]);
- }
- printf("%lld", ans);
- return ;
- }
AC代码
bzoj4566 找相同字符的更多相关文章
- 【BZOJ4566】找相同字符(后缀数组)
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...
- 【BZOJ4566】找相同字符(后缀自动机)
[BZOJ4566]找相同字符(后缀自动机) 题面 BZOJ 题解 看到多串处理,\(SA\)就连起来 \(SAM???\) 单串建自动机 然后其他串匹配 对于一个串建完\(SAM\)后 另一个串在\ ...
- 【BZOJ4566】[HAOI2016]找相同字符
[BZOJ4566][HAOI2016]找相同字符 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 其中\(1\le ...
- 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
[BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...
- BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机)
BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机) 题面 自己找去 HINT 给定两个文本串,问从两个串中各取一个非空子串,使这俩子串相同,问方案有多少种.我的思路 ...
- BZOJ4566 [Haoi2016]找相同字符【SAM】
BZOJ4566 [Haoi2016]找相同字符 给定两个字符串\(s和t\),要求找出两个字符串中所有可以相互匹配的子串对的数量 首先考虑可以怎么做,我们可以枚举\(t\)串的前缀\(t'\),然后 ...
- bzoj4566 / P3181 [HAOI2016]找相同字符
P3181 [HAOI2016]找相同字符 后缀自动机 (正解应是广义后缀自动机) 并不会广义后缀自动机. 然鹅可以用普通的后缀自动机. 我们先引入一个问题:算出从一个串内取任意两个不重合子串完全 ...
- [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 ...
随机推荐
- MHA高可用及读写分离
一.MHA简介 二.工作流程 三.MHA架构图 四.MHA工具介绍 五.基于GTID的主从复制 六.部署MHA 七.配置VIP漂移 八.配置binlog-server 九.MySQL中间件Atlas
- MyBatis的demo
把以前写的关于mybatis的demo放在这边,以便查看. 目录结构: package com.test.mybatis.util; import java.io.IOException; impor ...
- jenkins结合svn检测版本变化执行shell脚本实现项目部署
工具: centos 7 jenkins-2.138.2-1.1.noarch.rpm,2018年10月10号最新版(简单rpm包安装见https://www.cnblogs.com/dannylin ...
- 莫烦scikit-learn学习自修第三天【通用训练模型】
1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ import numpy as np from sklearn import datasets ...
- C-Lodop提示“网页还没下载完毕,请稍等一下再操作.”
该提示在Lodop旧版本中是: 提示"WebSocket没准备好,点确定继续",提示“C-Lodop没准备好”,新版本修改了该提示的描述“网页还没下载完毕,请稍等一下再操作.”,让 ...
- Cherry.chen window.clipboardData实现剪切板操作总结 (好像只有ie好用)
window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataForma ...
- ASP.NET Core Building chat room using WebSocket
Creating “Login form” We use here simple form where user can insert his or her preferred nick name f ...
- bzoj4152-[AMPPZ2014]The_Captain
Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...
- 洛谷P1434滑雪题解及记忆化搜索的基本步骤
题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...
- 大学jsp实验七--JavaBean在JSP中的应用
值bean的应用 (1)若有如下图所示的两个JSP页面,在第一个的页面的表单中填写相应内容,提交后再显示用户的提交信息.使用JavaBean的方式实现上述效果,请写出相应的代码. bean文件:Tes ...