Pagini recente » Cod sursa (job #2541880) | Cod sursa (job #119577) | Cod sursa (job #337342) | Cod sursa (job #1160778) | Cod sursa (job #1232657)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fi("substr.in");
ofstream fo("substr.out");
struct element{
int x,y;
int p;
bool operator<(const element &b)const{ return ((x==b.x)?(y<b.y):(x<b.x)); }
bool operator==(const element &b)const{ return (x==b.x && y==b.y); }
bool operator>(const element &b)const{ return ((x==b.x)?(y>b.y):(x>b.x)); }
};
const int max_len = 16504;
const int max_lg = 16;//(1<<15)=32768
int P[max_len][max_lg],v[max_len],pas,n,k;
char s[max_len];
element L[max_len];
void BuildSuffixArray(char *s, int n, int P[max_len][max_lg], int v[max_len]){
int i;
//pas=0, lung=1
for(i=1;i<=n;i++)
if(s[i]>='a' && s[i]<='z') P[i][0]=s[i]-'a'+1;
else if(s[i]>='A' && s[i]<='Z') P[i][0]=s[i]-'A'+29;
else if(s[i]>='0' && s[i]<='9') P[i][0]=s[i]-'0'+60;
for(pas=1; (1<<pas)<=2*n; ++pas)
{
for(i=1;i<=n;i++)
{
L[i].x=P[i][pas-1];
L[i].y=(i+(1<<(pas-1))<=n)?(P[i+(1<<(pas-1))][pas-1]):(-1);
L[i].p=i;
}
sort(L+1,L+n+1);
for(i=1;i<=n;i++)
P[L[i].p][pas]=(i>1 && L[i-1]==L[i])?(P[L[i-1].p][pas]):(i);
}
--pas;
for(i=1;i<=n;i++) v[P[i][pas]]=i;
}
int LCP(int x, int y){
int k,lung=0;;
if(x==y) return (n-x+1);
for(k=pas; k>=0 && x<=n && y<=n; --k)
if(P[x][k]==P[y][k])
{
x+=(1<<k);
y+=(1<<k);
lung+=(1<<k);
}
return lung;
}
int main(){
fi>>n>>k>>(s+1);
BuildSuffixArray(s,n,P,v);
int sol=0;
for(int i=1;i+k-1<=n;i++)
sol=max(sol,LCP(v[i],v[i+k-1]));
fo<<sol;
fi.close();
fo.close();
return 0;
}