Pagini recente » Cod sursa (job #2036020) | Cod sursa (job #266736) | Cod sursa (job #1273958) | Cod sursa (job #1847815) | Cod sursa (job #2400633)
#include <fstream>
#include <algorithm>
#define DIM 17000
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
struct idk{
int x,y,poz;
};
idk v[DIM];
int w[DIM],suf[17][DIM];
char s[DIM];
int n,k,i,j,ex,sol,lg;
bool cmp (idk a, idk b){
if (a.x == b.x){
if (a.y == b.y)
return a.poz < b.poz;
return a.y < b.y;
}
return a.x < b.x;
}
int lcp (int i, int j){
/// cel mai lung prefix comun care incepe pe i si j
int val = ex;
int sol = 0;
while (val >= 0){
if (suf[val][i] == suf[val][j]){
sol += (1<<val);
i += (1<<val);
j += (1<<val);
}
val--;
}
return sol;
}
int main (){
fin>>n>>k>>s;
for (i=0;i<n;i++)
suf[0][i] = s[i] - '0';
/// suf[ex][i] - nr de ordine al sufixului care incepe pe poz i si are lg (1<<ex)
for (lg=1;lg<=n;lg*=2,ex++){
for (i=0;i<n;i++){
v[i].x = suf[ex][i];
v[i].y = (i+lg < n) ? (suf[ex][i+lg]) : (-1);
v[i].poz = i;
}
sort (v,v+n,cmp);
for (i=1;i<n;i++){
if (v[i].x == v[i-1].x && v[i].y == v[i-1].y)
suf[ex+1][v[i].poz] = suf[ex+1][v[i-1].poz];
else suf[ex+1][v[i].poz] = 1+suf[ex+1][v[i-1].poz];
}
}
for (i=0;i<n;i++)
w[suf[ex][i]] = i;
/*for (i=0;i<=ex;i++){
for (j=0;j<n;j++)
fout<<suf[i][j]<<" ";
fout<<"\n";
}*/
for (i=0;i+k-1<n;i++)
sol = max (sol,lcp(w[i],w[i+k-1]));
fout<<sol;
return 0;
}