bzoj 4566: [Haoi2016]找相同字符
2017-02-18 23:53
309 查看
一直忘了放模板。。。
把两个串连起来做个后缀自动机对每个字串统计答案就行了。
把两个串连起来做个后缀自动机对每个字串统计答案就行了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 800005 using namespace std; int read() { int p=0;char c=getchar(); while(c<'0'||c>'9')c=getchar(); while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar(); return p; } int n,m; char s ,ss[200004],sss[200004]; int l ,tot,fa ,ch [30],v1 ,v2 ; long long ans; int qq ; bool cmp(int x,int y) { return l[x]>l[y]; } void build() { int lst=0; for(int i=0;i<=n+m;i++) { int c=s[i]-'a'; int p=lst;int np=++tot;lst=np; l[np]=l[p]+1; if(i<n)v1[np]=1; if(i>n)v2[np]=1; while(p&&!ch[p][c])ch[p][c]=np,p=fa[p]; int q=ch[p][c]; if(!q) { ch[p][c]=np; continue; } else if(l[q]==l[p]+1) { fa[np]=q; continue; } tot++;fa[tot]=fa[q]; fa[q]=fa[np]=tot; l[tot]=l[p]+1; for(int j=0;j<27;j++)ch[tot][j]=ch[q][j]; while(p&&ch[p][c]==q)ch[p][c]=tot,p=fa[p]; if(ch[p][c]==q)ch[p][c]=tot; } for(int i=0;i<=tot;i++)qq[i]=i; sort(qq,qq+tot+1,cmp); for(int i=0;i<=tot;i++) { v1[fa[qq[i]]]+=v1[qq[i]]; v2[fa[qq[i]]]+=v2[qq[i]]; } for(int i=0;i<=tot;i++) { ans+=(long long)(l[i]-l[fa[i]])*v1[i]*v2[i]; } return ; } int main() { scanf("%s",ss); scanf("%s",sss); n=strlen(ss);m=strlen(sss); for(int i=0;i<n;i++)s[i]=ss[i]; s ='z'+1; for(int i=0;i<m;i++)s[i+n+1]=sss[i]; build(); printf("%lld\n",ans); return 0; } /* babb abbb */
相关文章推荐
- bzoj 4566: [Haoi2016]找相同字符
- BZOJ 4566: [Haoi2016]找相同字符
- bzoj 4566: [Haoi2016]找相同字符
- 【bzoj4566】[Haoi2016]找相同字符
- bzoj 4566: [Haoi2016]找相同字符【SAM上DP
- 【BZOJ4566】【HAOI2016】找相同字符
- bzoj 4566: [Haoi2016]找相同字符 后缀自动机
- 【bzoj4566】[Haoi2016]找相同字符【后缀自动机】
- 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
- BZOJ 4566: [Haoi2016]找相同字符 [后缀自动机]
- [bzoj4566][HAOI2016]找相同字符
- BZOJ 4566: [Haoi2016]找相同字符(后缀数组的两种做法)
- [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)
- [BZOJ4566][HAOI2016]找相同字符
- Bzoj4566 [Haoi2016]找相同字符
- BZOJ 4566 [Haoi2016]找相同字符
- bzoj 4566: [Haoi2016]找相同字符(后缀自动机)
- 【bzoj4566】[Haoi2016]找相同字符
- ●BZOJ 4566 [Haoi2016]找相同字符
- ●BZOJ 4566 [Haoi2016]找相同字符