bzoj4566 / P3181 [HAOI2016]找相同字符
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- #define N 800005
- int n; char s1[N],s2[N];
- long long ans,tot;
- struct Sam{
- int nxt[N][],len[N],siz[N],fa[N];
- int p,q,last,ed,a[N],c[N];
- void clear(){
- last=ed=;
- memset(fa,,sizeof(fa));
- memset(nxt,,sizeof(nxt));
- memset(len,,sizeof(len));
- memset(siz,,sizeof(siz));
- memset(c,,sizeof(c));
- }
- void add(int c){
- p=last; len[last=++ed]=len[p]+; siz[ed]=;
- for(;p&&!nxt[p][c];p=fa[p]) nxt[p][c]=ed;
- if(!p){fa[ed]=; return;}
- q=nxt[p][c];
- if(len[q]==len[p]+){fa[ed]=q; return;}
- len[++ed]=len[p]+;
- memcpy(nxt[ed],nxt[q],sizeof(nxt[q]));
- fa[ed]=fa[q]; fa[q]=fa[ed-]=ed;
- for(;nxt[p][c]==q;p=fa[p]) nxt[p][c]=ed;
- }//裸的板子
- void calc(){
- for(int i=;i<=ed;++i) ++c[len[i]];
- for(int i=;i<=ed;++i) c[i]+=c[i-];
- for(int i=;i<=ed;++i) a[c[len[i]]--]=i;//对len进行排序代替dfs
- for(int i=ed;i;--i){
- int w=a[i]; siz[fa[w]]+=siz[w];
- tot+=1ll*siz[w]*(siz[w]-)/*(len[w]-len[fa[w]]);//累计每个点的贡献
- }
- }
- }sam;
- void solve(char *v,int x){
- tot=; n=strlen(v+); sam.clear();
- for(int i=;i<=n;++i) sam.add(v[i]-'a');
- sam.calc(); ans+=tot*x;
- }
- int main(){
- scanf("%s",s1+); scanf("%s",s2+);
- solve(s1,-); solve(s2,-);
- strcat(s1+,"{"); strcat(s1+,s2+);
- solve(s1,); printf("%lld",ans);
- return ;
- }
bzoj4566 / P3181 [HAOI2016]找相同字符的更多相关文章
- 【BZOJ4566】[HAOI2016]找相同字符
[BZOJ4566][HAOI2016]找相同字符 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 其中\(1\le ...
- 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
[BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...
- BZOJ4566:[HAOI2016]找相同字符——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4566 https://www.luogu.org/problemnew/show/P3181 给定 ...
- Bzoj4566:[HAOI2016]找相同字符
题面 Bzoj Sol 两个串拼在一起后求出后缀数组 然后显然的\(n^2\)暴力,就是直接枚举求\(LCP\) 又由于扫的时候是对\(height\)取\(min\) 那么可以用单调栈维护每一段的贡 ...
- Luogu P3181 [HAOI2016]找相同字符 广义$SAM$
题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt ...
- P3181 [HAOI2016]找相同字符
思路 广义SAM 把两个字符串建成广义SAM,然后统计两个SAM中相同节点的endpos大小乘积即可 记得开long long 代码 #include <cstdio> #include ...
- [洛谷P3181][HAOI2016]找相同字符
题目大意:给你两个字符串,求从两个字符串中各选择一个字串使得这两个字串相同的方案数. 题解:建广义$SAM$,对每个点求出在第一个串中出现次数和第二个串中出现次数,乘起来就行了 卡点:无 C++ Co ...
- BZOJ4566 [Haoi2016]找相同字符【SAM】
BZOJ4566 [Haoi2016]找相同字符 给定两个字符串\(s和t\),要求找出两个字符串中所有可以相互匹配的子串对的数量 首先考虑可以怎么做,我们可以枚举\(t\)串的前缀\(t'\),然后 ...
- [BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1212 Solved: 694[Submit][Stat ...
随机推荐
- 【LeetCode每天一题】Multiply Strings(字符串乘法)
Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and ...
- 原来CNN是这样提取图像特征的。。。
对于即将到来的人工智能时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的领域,会不会感觉马上就out了?作为机器学习的一个分支,深度学习同样需要计算机获得强大的学 ...
- (已解决)Eclipsez中打不开c++文件,显示Editor could not be initialized.
新建的游戏导入Eclipse能正常运行,配置什么的都弄好了,游戏运行无任何问题!问题是:关闭Eclipse后,重新打开,就会出现An internal error occurred during: & ...
- Error #2148
参考:https://blog.csdn.net/watersevenmmfx/article/details/52980804 chrome flash 安全沙箱冲突 SecurityError: ...
- 原生js---ajax---get方法传数据
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集
character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...
- SQLConnect
SQLConnect 函数定义: 这个函数就是与数据库建立连接 SQLRETURN SQLConnect( SQLHDBC ConnectionHandle, SQLCHAR * Se ...
- linux 安装 Python
一. 打开终端,输入:wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0b4.tgz 下载完毕后 输入解压命令:tar –zxvf Py ...
- 20155228 基于VirtualBox安装Ubuntu和学习linux命令的学习经历和心得
一.虚拟机VirtualBox的下载安装 基于VirtualBox虚拟机安装Ubuntu图文教程 虽然娄老师的教程对于VirtualBox的下载安装讲的很简单,可以说是一笔带过,但是我在下载安装的过程 ...
- 利用QPainter绘制散点图
[1]实例代码 (1)代码目录结构(备注:QtCreator默认步骤新建工程) (2)工程pro文件 QT += core gui greaterThan(QT_MAJOR_VERSION, ): Q ...