[BZOJ4278][ONTAK2015]Tasowanie(后缀数组+贪心)
来源:互联网 发布:unity3d能做帧动画吗 编辑:程序博客网 时间:2024/06/05 08:10
题目描述
传送门
题解
和队列变换那道题差不多
就是将两个串连起来求一个sa,然后归并的时候如果两个数相等的话就拿后缀字典序比较小的那一个
第一个串的结尾和第二个串的结尾要加一个比较大的字符,因为如果两个串比较前面的很多都相等的话,应该排除最后一位的影响,选比较多的一个串
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 400005int mid,n,m;int s[N],c[N],sa[N],rank[N],X[N],Y[N],*x,*y,ans[N];void build_sa(){ m=1002; x=X,y=Y; for (int i=0;i<m;++i) c[i]=0; for (int i=0;i<n;++i) ++c[x[i]=s[i]]; for (int i=1;i<m;++i) c[i]+=c[i-1]; for (int i=n-1;i>=0;--i) sa[--c[x[i]]]=i; for (int k=1;k<=n;k<<=1) { int p=0; for (int i=n-k;i<n;++i) y[p++]=i; for (int i=0;i<n;++i) if (sa[i]>=k) y[p++]=sa[i]-k; for (int i=0;i<m;++i) c[i]=0; for (int i=0;i<n;++i) ++c[x[y[i]]]; for (int i=0;i<m;++i) c[i]+=c[i-1]; for (int i=n-1;i>=0;--i) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for (int i=1;i<n;++i) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&(sa[i-1]+k<n?y[sa[i-1]+k]:-1)==(sa[i]+k<n?y[sa[i]+k]:-1)?p-1:p++; if (p>=n) break; m=p; } for (int i=0;i<n;++i) rank[sa[i]]=i;}int main(){ scanf("%d",&mid); for (int i=0;i<mid;++i) scanf("%d",&s[i]); s[mid]=1001; scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&s[mid+i]); n+=mid+1; build_sa(); int l=0,r=mid+1; while (l<mid&&r<n) { if (s[l]<s[r]) printf("%d ",s[l++]); else if (s[l]>s[r]) printf("%d ",s[r++]); else { if (rank[l]<rank[r]) printf("%d ",s[l++]); else printf("%d ",s[r++]); } } while (l<mid) printf("%d ",s[l++]); while (r<n) printf("%d ",s[r++]);}
总结
后缀数组一定要写p>=n,不要写p>n
从10s+蹦到2s+
0 0
- [BZOJ4278][ONTAK2015]Tasowanie(后缀数组+贪心)
- 【bzoj4278】 [ONTAK2015]Tasowanie 后缀数组
- BZOJ 4278: [ONTAK2015]Tasowanie|后缀数组|贪心
- 4278: [ONTAK2015]Tasowanie 后缀数组+贪心
- [后缀数组 贪心] BZOJ 4278 [ONTAK2015]Tasowanie
- [BZOJ4278] [ONTAK2015]Tasowanie
- bzoj4278: [ONTAK2015]Tasowanie
- bzoj 4278: [ONTAK2015]Tasowanie (后缀数组)
- bzoj 4278: [ONTAK2015]Tasowanie (后缀数组)
- BZOJ 4278 ONTAK2015 Tasowanie 后缀数组
- BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组
- bzoj 4278: [ONTAK2015]Tasowanie&bzoj 1692: [Usaco2007 Dec]队列变换 后缀数组+贪心
- 后缀数组+贪心+poj3623
- bzoj4278
- poj 3623 贪心,后缀数组
- FZU 2267 贪心 后缀数组
- 后缀数组+贪心+隔板法
- [BZOJ1692][Usaco2007 Dec]队列变换(贪心+后缀数组)
- Android Studio 出现Failed to open zip file的问题
- 欢迎使用CSDN-markdown编辑器
- 在一个千万级的数据库中查询,如何提高查询效率
- 第一个task
- PAT (Advanced Level) Practise 1004 Counting Leaves
- [BZOJ4278][ONTAK2015]Tasowanie(后缀数组+贪心)
- css----总结1
- L1-006. 连续因子
- kalman
- 敏捷团队中测试人员比率
- Android之用tcpdump常用抓包命令使用总结
- React Native 之 TextInput使用
- hdu2553 n皇后问题 dfs搜索 记忆化
- IOS基础之宏定义