记录编号 |
156381 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO Dec06]产奶的模式 |
最终得分 |
100 |
用户昵称 |
OIdiot |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.019 s |
提交时间 |
2015-04-04 16:49:25 |
内存使用 |
1.91 MiB |
显示代码纯文本
/*
Machine: Class4_B2
System: Ubuntu_Kylin 14.10
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <ctime>
#include <map>
#include <algorithm>
typedef long long LL;
using namespace std;
#define SpeedUp ios::sync_with_stdio(false)
#define Judge
//#define Debug
#define MAXN (20005)
#define INF ()
const double PI=acos(-1);
const int ZCY=1000000007;
const double eps=1e-8;
inline int getint(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void outputint(int x){
char ch[12];
int cnt=0;
if(x==0) {putchar('0'); putchar(10);return;}
if(x<0) {putchar('-'); x=-x;}
while(x) ch[++cnt]=x%10,x/=10;
while(cnt) putchar(ch[cnt--]+48);
putchar(10);
}
#define print(x) outputint(x)
#define read(x) x=getint()
#define sqr(x) ((x)*(x))
int N,K;
int C[MAXN];
int ans;
struct Suffix_Automaton{
struct Node{
map<int,int> son;
Node *fa;
int step,right;
inline void Init(){
son.clear();
fa=NULL,step=right=0;
}
}node[MAXN<<1],*fst,*fnl,*tmp[MAXN<<1];
int tot;
void Init(){
fst=fnl=&node[tot=1];
fst->Init();
}
inline void Add(int x){
Node *p=fnl,*np=&node[++tot];
np->step=p->step+1;
np->right=1;
while(p && p->son.find(x)==p->son.end()){
p->son[x]=np-node;
p=p->fa;
}
if(p==NULL){
np->fa=fst;
}else{
Node *q=node+(p->son[x]);
if(q->step==p->step+1){
np->fa=q;
}else{
Node *nq=&node[++tot];
*nq=*q;
nq->step=p->step+1;
nq->right=0;
np->fa=q->fa=nq;
while(p && p->son[x]==q-node){
p->son[x]=nq-node;
p=p->fa;
}
}
}
fnl=np;
}
void Calc_Info(){
for(int i=1;i<=tot;i++)
C[node[i].step]++;
for(int i=1;i<=N;i++)
C[i]+=C[i-1];
for(int i=1;i<=tot;i++){
Node *p=&node[i];
tmp[C[p->step]--]=p;
}
for(int i=tot;i>1;i--){
Node *p=tmp[i];
if(p->fa){
p->fa->right+=p->right;
if(p->fa!=node+1 && p->fa->right>=K)
ans=max(ans,p->fa->step);
}
}
}
}SAM;
void init(){
int x;
#ifdef Judge
freopen("patterns.in","r",stdin);
freopen("patterns.out","w",stdout);
// SpeedUp;
#endif
read(N),read(K);
SAM.Init();
for(int i=1;i<=N;i++)
read(x),SAM.Add(x);
}
void work(){
SAM.Calc_Info();
print(ans);
}
int main(){
init();
work();
//#ifdef Debug
cerr<<"Time Used : "<<(double)clock()/CLOCKS_PER_SEC<<" s."<<endl;
cerr<<"Memory Used : "<<(double)(sizeof(SAM))/1048576<<" MB."<<endl;
//#endif
return 0;
}