【BZOJ4566】【HAOI2016】找相同字符
后缀自动姬好,好写好调好ac
原题:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- using namespace std;
- #define ll long long
- int rd(){int z=,mk=; char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
- while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
- return z*mk;
- }
- char a[],b[]; int n,m;
- int nxt[][],fa[],mx[],sz[];
- int lst=,tt=;
- int cnt[],cntrk[];
- ll f[];
- void ist(int x){
- int p=lst,np=lst=++tt;
- mx[np]=mx[p]+; sz[np]=;
- while(!nxt[p][x] && p) nxt[p][x]=np,p=fa[p];
- if(!p) fa[np]=;
- else{
- int q=nxt[p][x];
- if(mx[p]+==mx[q]) fa[np]=q;
- else{
- int nq=++tt; mx[nq]=mx[p]+;
- memcpy(nxt[nq],nxt[q],sizeof(nxt[q]));
- fa[nq]=fa[q],fa[q]=fa[np]=nq;
- while(nxt[p][x]==q) nxt[p][x]=nq,p=fa[p];
- }
- }
- }
- void gtcntrk(){
- for(int i=;i<=tt;++i) ++cnt[mx[i]];
- for(int i=;i<=n;++i) cnt[i]+=cnt[i-];
- for(int i=tt;i;--i) cntrk[cnt[mx[i]]--]=i;
- }
- void gtf(){
- for(int i=tt;i;--i) sz[fa[cntrk[i]]]+=sz[cntrk[i]];
- for(int i=;i<=tt;++i)
- f[cntrk[i]]=f[fa[cntrk[i]]]+(ll)sz[cntrk[i]]*(mx[cntrk[i]]-mx[fa[cntrk[i]]]);
- }
- int main(){//freopen("ddd.in","r",stdin);
- scanf("%s%s",a+,b+); n=strlen(a+),m=strlen(b+);
- for(int i=;i<=n;++i) ist(a[i]-'a');
- gtcntrk(),gtf();
- ll bwl=; int l=,tmp=,x;
- for(int i=;i<=m;++i){
- x=b[i]-'a';
- if(nxt[tmp][x]) tmp=nxt[tmp][x],++l;
- else{
- while(!nxt[tmp][x] && tmp) tmp=fa[tmp];
- if(!tmp) tmp=,l=;
- else l=mx[tmp]+,tmp=nxt[tmp][x];
- }
- if(tmp!=) bwl+=f[fa[tmp]]+(ll)sz[tmp]*(l-mx[fa[tmp]]);
- }
- cout<<bwl<<endl;
- return ;
- }
【BZOJ4566】【HAOI2016】找相同字符的更多相关文章
- 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 ...
- [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)
4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 861 Solved: 495[Submit][Statu ...
- BZOJ4566 [Haoi2016]找相同字符 字符串 SAM
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4566.html 题目传送门 - BZOJ4566 题意 给定两个字符串 $s1$ 和 $s2$ ,问有 ...
- BZOJ4566: [Haoi2016]找相同字符
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...
- BZOJ4566: [Haoi2016]找相同字符(后缀自动机)
题意 题目链接 Sol 直接在SAM上乱搞 枚举前缀,用SAM统计可以匹配的后缀,具体在匹配的时候维护和当前节点能匹配的最大值 然后再把parent树上的点的贡献也统计上,这部分可以爆跳parent树 ...
- BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...
- BZOJ4566:[HAOI2016]找相同字符(SAM)
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...
- BZOJ4566 [Haoi2016]找相同字符 【后缀数组】
题目 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 输入格式 两行,两个字符串s1,s2,长度分别为n1,n2.1 & ...
- BZOJ4566 HAOI2016找相同字符(后缀自动机)
对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...
随机推荐
- python 学习 map /reduce
python 内建了map()和reduce()函数 map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. ...
- cocos2d方块方块
cGridSize=32 cSceneWidth=8+2 cSceneHeight=18 fuction Grid2Pos(x,y) local visibleSize=cc.Director:get ...
- python if elif else判断语句
username = 'jack' password = ' _username = input('username') _password = input('password') if userna ...
- maven scope和项目发布需要注意的地方
Maven Scope的使用: http://www.cnblogs.com/wangyonghao/p/5976055.html servlet-api和jsp-api等jar包,一般由servle ...
- 外部点击链接,登陆后,直接跳转到该链接(过滤器 + Cookie实现)
一.web.xml (1)指定过滤的Servlet类 (2)配置过滤规则,过滤以.mail结尾的链接 <?xml version="1.0" encoding="U ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Invalid MEX-file: caffe.mexa64 的解决方案
http://blog.csdn.net/iamzhangzhuping/article/details/53105708
- bootstrap动态生成层级ul-li 新闻预览 常用方法
<div class="row" id="add-withinfosortId-row" style="display: none"& ...
- hdu3861 强连通分量缩点+二分图最最小路径覆盖
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- javascript动态加载js文件主流浏览器兼容版
一.代码示例: <html> <head> <meta http-equiv="Content-Type" content="text/ht ...