[poj3261]Milk Patterns
求出后缀数组和height数组,然后二分答案后分组查询,一个块内如果有超过k个那么这个答案就可以。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50005 4 int n,m,ans,a[N],b[N],h[N],sum[N],ra[N<<1],sa[N]; 5 char s[N],s1[N]; 6 void change(){ 7 for(int i=0;i<n;i++)a[i]=s[i]; 8 memcpy(ra,a,sizeof(a)); 9 sort(a,a+n); 10 m=unique(a,a+n)-a; 11 for(int i=0;i<n;i++)ra[i]=lower_bound(a,a+m,ra[i])-a+1; 12 } 13 void sort(int k){ 14 memset(sum,0,sizeof(sum)); 15 for(int i=0;i<n;i++)sum[ra[i+k]+1]++; 16 for(int i=1;i<=m;i++)sum[i+1]+=sum[i]; 17 for(int i=0;i<n;i++)b[sum[ra[a[i]+k]]++]=a[i]; 18 } 19 void build(){ 20 for(int i=1;;i<<=1){ 21 for(int j=0;j<n;j++)a[j]=j; 22 sort(i); 23 memcpy(a,b,sizeof(a)); 24 sort(0); 25 m=a[b[0]]=1; 26 for(int j=1;j<n;a[b[j++]]=m) 27 if ((ra[b[j-1]]!=ra[b[j]])||(ra[b[j-1]+i]!=ra[b[j]+i]))m++; 28 memcpy(ra,a,sizeof(a)); 29 if (m==n)break; 30 } 31 for(int i=0;i<n;i++)sa[ra[i]]=i; 32 } 33 void height(){ 34 m=0; 35 for(int i=0;i<n;h[ra[i++]]=m,m-=(m>0)) 36 for(int j=sa[ra[i]-1];(i!=j)&&(s[i+m]==s[j+m]);m++); 37 h[1]=0; 38 } 39 int lcp(int x,int y){ 40 int ans=0x3f3f3f3f; 41 if (ra[x]>ra[y])swap(x,y); 42 for(int i=ra[x]+1;i<=ra[y];i++)ans=min(ans,h[i]); 43 return ans; 44 } 45 void write(int x,int y){ 46 for(int i=x;i<=y;i++)printf("%c",s[i]); 47 } 48 int main(){ 49 int t; 50 scanf("%d",&t); 51 while (t--){ 52 scanf("%s",s); 53 n=strlen(s); 54 change(); 55 build(); 56 height(); 57 ans=0; 58 for(int i=1;i<=n;i++)ans+=n-sa[i]-h[i]; 59 printf("%d\n",ans); 60 } 61 }
View Code
转载于:https://www.cnblogs.com/PYWBKTDA/p/11254712.html
[poj3261]Milk Patterns相关推荐
- [POJ3261] Milk Patterns
LINK 此题的常规做法是 二分 + 后缀数组 ,但本蒟蒻还是习惯写 并查集 的做法 算法流程 1.离散化是肯定要有的,给的数据太大了,不离散化会RE 2.先跑一遍SA,把最重要的h数组求出来 3.把 ...
- Poj3261 Milk Patterns
题目传送门 题意:对一个字符串求一个最长的子串使得它至少出现k次 额,因为这个题目呢,他的字符集非常大(100W) 所以直接用SAM是不行了,我们考虑用离散化+SA,让后就可以分块rmq了 当然这样很 ...
- POJ3261 Milk Patterns 【后缀数组】
牛奶模式 时间限制: 5000MS 内存限制: 65536K 提交总数: 16796 接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...
- P2852 [USACO06DEC]Milk Patterns G
题目描述 Farmer John has noticed that the quality of milk given by his cows varies from day to day. On f ...
- 后缀数组2.0--Height数组(bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式)
前置技能:后缀数组 height[i]:排名第i的后缀与排名第i-1的后缀的最长公共前缀,也就是sa[i]和sa[i-1]的最长公共前缀 h[i]:以第i个字符为起点的后缀与排名在它前1名的后缀的最长 ...
- bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
先求后缀数组.相邻两个后缀的最长公共前缀 二分答案,o(n)check 1 #include<algorithm> 2 #include<iostream> 3 #includ ...
- 【USACO06DEC】—牛奶模式Milk Patterns(后缀自动机)
传送门 后缀自动机板子题了吧 只需要求Parent−TreeParent-TreeParent−Tree上非叶子节点的最长的lenlenlen就可以了 因为字符集太大又不想离散化 就直接用mapmap ...
- POJ - 3261 Milk Patterns(二分+后缀数组)
题目链接:点击查看 题目大意:给出一个字符串,以及一个k,现在求出现次数大于等于k次的最大可重叠子串的长度 题目分析:可以说是后缀数组的模板题目了吧..直接跑出height数组,因为height数组代 ...
- poj 3261 Milk Patterns 后缀数组 最长重复子串
http://poj.org/problem?id=3261 给一串数组,数组最少含有k个相同子串,可重叠,求这样子串的最长长度. 后缀数组求出 height[],若连续k个height[]都大于mi ...
最新文章
- java 设计模式学习笔记十 bridge桥模式
- 【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义
- php ajax无刷新翻页,php ajax 无刷新翻页实现代码
- jQuery补充及Django基本使用_Day18
- [Share]前端开发大众手册(包括工具、网址、经验等)
- 【WPF】Slider 任意位置拖动
- caffe linux 教程,Caffe 深度学习入门教程
- 关于Latex中smart pdf反向搜索问题
- ASF文件格式详解(1)
- 今天碰到的一件盗QQ诈骗案
- 定时器 java qua_Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )
- 陀螺仪mpu6050的使用(附带HAL的使用)
- Android查询通讯录信息
- win32 api CreateWindow创建窗口控件及设置字体
- JAVA加密工具类实例
- ​Cocos Creator入门实战:桌球小游戏
- MSP430控制AD7712采集数据
- 谈谈您不知道的湖南创发科技 讲诉我在创发的经历
- GPU虚拟化技术 GVT-g GVT-s GVT-d AMD NVIDIA
- 乱炖“简书交友”数据之代码(2):关键词抽取、Word2Vec词向量
热门文章
- strstrsubstr、AfxGetApp
- python中import os_Python常用模块os--与操作系统交互
- div超出不换行_div+CSS设置一行内文字超过宽度不换行且不显示
- Web框架——Flask系列之宏、继承、包含(十八)
- 已安装Anaconda情况下,命令行pip,python报错(详细 已解决)
- Scala 入门1(变量、分支循环、函数)
- LeetCode 1722. 执行交换操作后的最小汉明距离(并查集)
- 牛客 牛牛选物(01背包)
- [Kaggle] Heart Disease Prediction
- LeetCode 560. 和为K的子数组(前缀和差分)