Pagini recente » Cod sursa (job #2201737) | Cod sursa (job #1460528) | Cod sursa (job #1208020) | Cod sursa (job #760567) | Cod sursa (job #1470244)
#include <fstream>
#include <algorithm>
#define NMAX 16384
#define LOGMAX 15
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n,k,p,el,boss;
int ind[NMAX],LCP[NMAX];
int best[LOGMAX][NMAX],RMQ[LOGMAX][NMAX];
string S;
struct elem{
int poz;
int nr[2];
}X[NMAX];
inline bool comp(elem e1,elem e2){
return (e1.nr[0]!=e2.nr[0]?e1.nr[0]<e2.nr[0]:e1.nr[1]<e2.nr[1]);
}
inline int prefix(int i,int j){
int pref=0,ii=ind[i],jj=ind[j];
for (int pp=p-1;pp>=0;pp--)
if (jj+(1<<pp)<n && best[pp][ii]==best[pp][jj])ii+=1<<pp,jj+=1<<pp,pref+=1<<pp;
return pref;
}
int main(){
f>>n>>k;
if (k==1){
g<<n;
return 0;
}
f>>S;
for (int i=0;i<n;i++)
best[0][i]=S[i]-'a';
for (p=1;(1<<p)<n;p++,el=0){
for (int i=0;i<n;i++){
X[i].poz=i;
X[i].nr[0]=best[p-1][i];
X[i].nr[1]=(i+(1<<(p-1))<n?best[p-1][i+(1<<(p-1))]:-1);
}
sort(X,X+n,comp);
for (int i=0;i<n;i++){
if (1<<(p+1)>=n)ind[i]=X[i].poz;
best[p][X[i].poz]=(X[i-1].nr[0]==X[i].nr[0] && X[i-1].nr[1]==X[i].nr[1]?el:++el);
}
}
for (int i=0;i+k-1<n;i++){
int val=prefix(i,i+k-1);
boss=(val>boss?val:boss);
}
g<<boss;
}