BZOJ 4566: [Haoi2016]找相同字符
来源:互联网 发布:上海华东理工网络教育 编辑:程序博客网 时间:2024/04/29 01:13
多串SAM
两串中相同的字串会在同一节点
每个节点搞个siz表示这个节点代表的字串出现了多少次
当然还要加一维,表示在哪个串中出现的次数
于是答案就是sigma (len[i]-len[par[i]])*siz[0][i]*siz[1][i]了
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<algorithm>#include<map>#include<set>#include<stack>#define rep(i,l,r) for(int i=l;i<=r;i++)#define per(i,r,l) for(int i=r;i>=l;i--)#define mmt(a,v) memset(a,v,sizeof(a))#define tra(i,u) for(int i=head[u];i;i=e[i].next)using namespace std;typedef long long ll;const int N=200000+5;const int M=800000+5;int par[M],ch[M][26],siz[2][M],len[M],root,sz,last;void init(){last=root=sz=1;}void extend(int x){int p=last,np=++sz;len[np]=len[p]+1;for(;p&&!ch[p][x];p=par[p])ch[p][x]=np;if(!p)par[np]=root;else{int q=ch[p][x];if(len[q]==len[p]+1)par[np]=q;else{int nq=++sz;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));par[nq]=par[q];par[q]=par[np]=nq;for(;p&&ch[p][x]==q;p=par[p])ch[p][x]=nq;}}last=np;}int deg[M];void toposort(){rep(i,1,sz)deg[par[i]]++;queue<int>q;rep(i,1,sz)if(!deg[i])q.push(i);while(!q.empty()){int u=q.front();q.pop();siz[0][par[u]]+=siz[0][u];siz[1][par[u]]+=siz[1][u];deg[par[u]]--;if(!deg[par[u]])q.push(par[u]);}}char s[N];int main(){//freopen("a.in","r",stdin);scanf("%s",s+1);int n=strlen(s+1);init();int p=root;rep(i,1,n){extend(s[i]-'a');p=ch[p][s[i]-'a'];siz[0][p]++;}scanf("%s",s+1);n=strlen(s+1);last=root;p=root;rep(i,1,n){extend(s[i]-'a');p=ch[p][s[i]-'a'];siz[1][p]++;}toposort();ll ans=0;rep(i,1,sz)if(par[i])ans+=1LL*(len[i]-len[par[i]])*siz[0][i]*siz[1][i];printf("%lld\n",ans);return 0;}
0 0
- BZOJ 4566: [Haoi2016]找相同字符
- BZOJ 4566: [Haoi2016]找相同字符
- BZOJ 4566 [Haoi2016]找相同字符
- 4566: [Haoi2016]找相同字符
- 4566: [Haoi2016]找相同字符
- bzoj 4566: [Haoi2016]找相同字符【SAM上DP
- bzoj 4566: [Haoi2016]找相同字符(后缀自动机)
- [后缀自动机 parent树] BZOJ 4566 [Haoi2016]找相同字符
- bzoj 4566: [Haoi2016]找相同字符 后缀自动机
- BZOJ 4566: [Haoi2016]找相同字符 后缀自动机
- BZOJ 4566 [Haoi2016]找相同字符 后缀数组+ST表
- [后缀自动机][树形DP] BZOJ 4566: [Haoi2016]找相同字符
- BZOJ4566 [Haoi2016]找相同字符
- [bzoj4566][HAOI2016]找相同字符
- 【bzoj4566】[Haoi2016]找相同字符
- bzoj4566【HAOI2016】找相同字符
- 【bzoj4566】[Haoi2016]找相同字符
- 【bzoj4566】[Haoi2016]找相同字符
- Git常用命令,很全很详细讲解的也不错
- 存储scale-up和scalce-out架构
- [leetcode] 【数组】 60. Permutation Sequence
- 003 创建Android应用程序的工程
- 【一天一道LeetCode】#56. Merge Intervals
- BZOJ 4566: [Haoi2016]找相同字符
- JDK1.6.0+Tomcat6.0+myeclipse6.5的安装配置
- python zip( )函数
- 125. Valid Palindrome
- 【STL】back_inserter与back_insert_iterator
- hdu5690All X 「矩阵快速幂」
- Notification的几种用法(API不同)
- 从零开始学_JavaScript_系列(20)——js系列<7>(函数原型的两种声明方式、函数的作用域)
- BZOJ 4566: [Haoi2016]找相同字符