[poj 3261]Milk Patterns
后缀数组搞一下就可以了喵~
其实这道题的第一个想法是 SAM ,建完后缀自动机后拓扑排序跑一遍统计下每个子串的出现次数就 O(N) 就妥妥过掉了
后缀树也是 O(N) 的,统计一下每个节点对应的子树中有多少个叶子节点即可
可是看了一下数据范围,欸呦你妹啊,字符数 1000000+1 是什么心态啊!居然把我的后缀树和后缀 zdj 都卡掉了啊!
然后很痛苦的想了想后缀数组的做法:
搞出 sa, rank, height 三个数组后,跑一遍二分,用一个 tot 表示找到了几个子串
二分答案 L,O(N) 扫个遍如果 height[i]>=L 说明又找到一个子串,tot++,否则重新计算
不过注意这里 tot 的初始值是 1 而不是 0
不过这么个写法怎么写都是 O(NlogN) 的了,如果有更好的写法,请教我做人喵~
#include <cstdio>
#include <cstring>
const int sizeOfN=20002;
const int sizeOfType=1200021; namespace IOspace
{
inline int getint()
{
register int num=0;
register char ch;
do ch=getchar(); while (ch<'0' || ch>'9');
do num=num*10+ch-'0', ch=getchar(); while (ch>='0' && ch<='9');
return num;
}
inline void putint(int num)
{
char stack[15];
register int top=0;
if (num==0) stack[top=1]='0';
for ( ;num;num/=10) stack[++top]=num%10+'0';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
} int N, K;
int A[sizeOfN]; namespace suffixArray
{
int sa[sizeOfN], rank[sizeOfN], height[sizeOfN]; inline void swap(int *& x, int *& y) {int * t=x; x=y; y=t;}
inline void buildArray()
{
static int t[2][sizeOfN];
static int c[sizeOfType];
int * x=t[0], * y=t[1];
int M=sizeOfType; for (int i=0;i<M;i++) c[i]=0;
for (int i=0;i<N;i++) c[x[i]=A[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 j=0, k=1;j<N;M=j, k<<=1)
{
j=0;
for (int i=N-k;i<N;i++) y[j++]=i;
for (int i=0;i<N;i++) if (sa[i]>=k) y[j++]=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=1;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);
j=1; x[sa[0]]=0;
for (int i=1;i<N;i++)
x[sa[i]]=y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]==y[sa[i]+k]?j-1:j++;
}
}
inline void calcHeight()
{
int l=0;
for (int i=0;i<N;i++) rank[sa[i]]=i;
for (int i=0;i<N;i++)
{
int j=sa[rank[i]-1];
for (l=l?l-1:0;A[i+l]==A[j+l];l++);
height[rank[i]]=l;
}
}
} inline int search(); int main()
{
N=IOspace::getint(), K=IOspace::getint();
for (int i=0;i<N;i++) A[i]=IOspace::getint()+1;
A[N++]=0; suffixArray::buildArray();
suffixArray::calcHeight(); IOspace::putint(search()); return 0;
}
inline bool check(int l)
{
int tot=1;
for (int i=1;i<N;i++)
if (suffixArray::height[i]>=l)
{
if (++tot>=K)
return true;
}
else
tot=1; return false;
}
inline int search()
{
int L=0, R=N, M; while (L+1<R)
{
M=(L+R)>>1;
if (check(M)) L=M;
else R=M;
} return L;
}
机房里把 插入代码(推荐) 给卡了真是 sang xin bing kuang!我要申诉!
[poj 3261]Milk Patterns的更多相关文章
- POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)+后缀数组模板
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7586 Accepted: 3448 Cas ...
- POJ 3261 Milk Patterns 【后缀数组 最长可重叠子串】
题目题目:http://poj.org/problem?id=3261 Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Subm ...
- POJ 3261 Milk Patterns 可重复k次的最长重复子串
Milk PatternsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3261 Description ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
- poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7938 Accepted: 3598 Cas ...
- POJ 3261 Milk Patterns (后缀数组,求可重叠的k次最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16742 Accepted: 7390 Ca ...
- Poj 3261 Milk Patterns(后缀数组+二分答案)
Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...
- POJ 3261 Milk Patterns(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=3261 [题目大意] 求最长可允许重叠的出现次数不小于k的子串. [题解] 对原串做一遍后缀数组,二分子串长度x,将前缀相同长度超过 ...
- 后缀数组 POJ 3261 Milk Patterns
题目链接 题意:可重叠的 k 次最长重复子串.给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠. 分析:与POJ 1743做法类似,先二分答案,height数组分段后统计 LC ...
随机推荐
- C# 启动关闭.exe进程(转)
后台代码: 1 using System.Diagnostics; 2 3 protected void Button1_Click(object sender, EventArgs e)4 ...
- memcpy的用法及实现
memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,返回dest所指内存地址的起始位置. #include <string.h&g ...
- C#线程状态简析
在C# 语言世界中,当我们创建一个新的子线程,该线程状态为unstarted, 子线程开始之后,子线程状态为Running,IsAlive 为true: 线程响应 Thread.Start 并开始运行 ...
- 解决win7资源监视器不能开启
刚开始时是这样,点击开始监控,无效 需要开始服务即可解决
- false等于0???
看到一个函数strpos($string,$str),用于在字符串$string中查找$str,如果在$string中查找到$str,则返回第一次出现的位置,起始位置为0:如果$string中不包含$ ...
- iOS:死锁
死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进. 安全状态与不安全状态:安全状态指系统能按某个进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程 ...
- ESXi cron jobs
#Edit corn jobs vi /var/spool/cron/crontabs/root # Check crond pross id cat /var/run/crond.pid # Kil ...
- Cisco ASA 高级配置
Cisco ASA 高级配置 一.防范IP分片攻击 1.Ip分片的原理: 2.Ip分片的安全问题: 3.防范Ip分片. 这三个问题在之前已经详细介绍过了,在此就不多介绍了.详细介绍请查看上一篇文章:I ...
- IOS中怎么使用微软雅黑字体
http://www.cnblogs.com/GnagWang/archive/2011/09/14/2176266.html
- GETorPOST方式保存和获取图片信息
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...