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每天一题】Reverse String
Write a function that reverses a string. The input string is given as an array of characters char[]. ...
- js模拟栈
栈:先入后出,后入先出 链表:先入先出,后入后出 下面使用js实现栈 var Stack = (function(){ var items = new WeakMap(); //先入后出,后入先出 c ...
- windows-spidermonkey
听过Mozilla(火狐浏览器的娘家)的javascript引擎吗?感兴趣吗?想在windows平台的应用开发中使用这个引擎吗? 肯定? 好,往下看! 本文给出Windows平台SpiderMonke ...
- vue父子组件写法,数据传递,顺便封装 element-ui的弹窗组建
父组件如下: <template> <div class="print"> <el-button @click="bbclick" ...
- java随机排座位
//打乱学生顺序 Collections.shuffle(); 容我记个单词 peer: vi.凝视; 盯着看; 隐退,若隐若现; 同等,比得上;n.同辈,同等的人; 贵族; 同伴,伙伴;adj.贵族 ...
- servlet的请求转发与重定向
重定向: Spring的重定向 spring的请求转发:
- linux 系统 cp: omitting directory 问题解决
在linux系统中复制文件夹时提示如下: cp: omitting directory `foldera/' 其中foldera是我要复制的文件夹名,出现该警告的原因是因为foldera目录下还存在目 ...
- SpringBoot返回json格式到浏览器上,出现乱码问题
在对应的Controller上的requestMapping中添加: @RestController@EnableAutoConfiguration@RequestMapping(value = &q ...
- Python 5 -- 模块
模块 - 模块就是包含函数的文件,用于共享代码. 导入已有模块 # 导入整个模块 import random # 导入整个模块 print(random.randint(0,255)) #调用模块中的 ...
- mysql的指令
mysql有一下几方面的特性: 1:多语言支持 2:可以移植性好 3:免费开源 4:高效(支持多线程,充分利用cpu资源,运行速度非常) 5:支持大量数据查询和储存 6:操作简单易于学习 其实数据库就 ...