求出后缀数组和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相关推荐

  1. [POJ3261] Milk Patterns

    LINK 此题的常规做法是 二分 + 后缀数组 ,但本蒟蒻还是习惯写 并查集 的做法 算法流程 1.离散化是肯定要有的,给的数据太大了,不离散化会RE 2.先跑一遍SA,把最重要的h数组求出来 3.把 ...

  2. Poj3261 Milk Patterns

    题目传送门 题意:对一个字符串求一个最长的子串使得它至少出现k次 额,因为这个题目呢,他的字符集非常大(100W) 所以直接用SAM是不行了,我们考虑用离散化+SA,让后就可以分块rmq了 当然这样很 ...

  3. POJ3261 Milk Patterns 【后缀数组】

    牛奶模式 时间限制: 5000MS   内存限制: 65536K 提交总数: 16796   接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...

  4. 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 ...

  5. 后缀数组2.0--Height数组(bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式)

    前置技能:后缀数组 height[i]:排名第i的后缀与排名第i-1的后缀的最长公共前缀,也就是sa[i]和sa[i-1]的最长公共前缀 h[i]:以第i个字符为起点的后缀与排名在它前1名的后缀的最长 ...

  6. bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    先求后缀数组.相邻两个后缀的最长公共前缀 二分答案,o(n)check 1 #include<algorithm> 2 #include<iostream> 3 #includ ...

  7. 【USACO06DEC】—牛奶模式Milk Patterns(后缀自动机)

    传送门 后缀自动机板子题了吧 只需要求Parent−TreeParent-TreeParent−Tree上非叶子节点的最长的lenlenlen就可以了 因为字符集太大又不想离散化 就直接用mapmap ...

  8. POJ - 3261 Milk Patterns(二分+后缀数组)

    题目链接:点击查看 题目大意:给出一个字符串,以及一个k,现在求出现次数大于等于k次的最大可重叠子串的长度 题目分析:可以说是后缀数组的模板题目了吧..直接跑出height数组,因为height数组代 ...

  9. poj 3261 Milk Patterns 后缀数组 最长重复子串

    http://poj.org/problem?id=3261 给一串数组,数组最少含有k个相同子串,可重叠,求这样子串的最长长度. 后缀数组求出 height[],若连续k个height[]都大于mi ...

最新文章

  1. java 设计模式学习笔记十 bridge桥模式
  2. 【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义
  3. php ajax无刷新翻页,php ajax 无刷新翻页实现代码
  4. jQuery补充及Django基本使用_Day18
  5. [Share]前端开发大众手册(包括工具、网址、经验等)
  6. 【WPF】Slider 任意位置拖动
  7. caffe linux 教程,Caffe 深度学习入门教程
  8. 关于Latex中smart pdf反向搜索问题
  9. ASF文件格式详解(1)
  10. 今天碰到的一件盗QQ诈骗案
  11. 定时器 java qua_Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )
  12. 陀螺仪mpu6050的使用(附带HAL的使用)
  13. Android查询通讯录信息
  14. win32 api CreateWindow创建窗口控件及设置字体
  15. JAVA加密工具类实例
  16. ​Cocos Creator入门实战:桌球小游戏
  17. MSP430控制AD7712采集数据
  18. 谈谈您不知道的湖南创发科技 讲诉我在创发的经历
  19. GPU虚拟化技术 GVT-g GVT-s GVT-d AMD NVIDIA
  20. 乱炖“简书交友”数据之代码(2):关键词抽取、Word2Vec词向量

热门文章

  1. strstrsubstr、AfxGetApp
  2. python中import os_Python常用模块os--与操作系统交互
  3. div超出不换行_div+CSS设置一行内文字超过宽度不换行且不显示
  4. Web框架——Flask系列之宏、继承、包含(十八)
  5. 已安装Anaconda情况下,命令行pip,python报错(详细 已解决)
  6. Scala 入门1(变量、分支循环、函数)
  7. LeetCode 1722. 执行交换操作后的最小汉明距离(并查集)
  8. 牛客 牛牛选物(01背包)
  9. [Kaggle] Heart Disease Prediction
  10. LeetCode 560. 和为K的子数组(前缀和差分)