Pagini recente » Cod sursa (job #846837) | Cod sursa (job #1059162) | Cod sursa (job #2254745) | Cod sursa (job #794032) | Cod sursa (job #1012431)
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;
typedef struct { int s1,s2,poz; } tip;
tip aux[17000];
int i,n,m,p[17000][16],d,log,l,rez,j,ind[17000];
string s;
bool cmp( const tip &a, const tip &b) {
if (a.s1!=b.s1) return(a.s1<b.s1); else return(a.s2<b.s2);
}
int prefix(int x, int y) {
int sol=0;
if (x==y) return(n-x+1);
for (int i=log; i>=0 && x<=n && y<=n; --i)
if (p[x][i]==p[y][i]) { sol+=(1<<i); x+=(1<<i); y+=(1<<i); }
return(sol);
}
int main(void){
ifstream fin("substr.in");
ofstream fout("substr.out");
fin>>n>>d; getline(fin,s); getline(fin,s);
for (i=1; i<=n; ++i) p[i][0]=s[i-1]-'a';
int n1=n;
while (n1>0) { ++log; n1/=2; }
for (i=1, l=1; i<=log && l<=n; ++i, l*=2) {
for (j=1; j<=n; ++j) {
aux[j].s1=p[j][i-1];
if (j+l<=n) aux[j].s2=p[j+l][i-1]; else aux[j].s2=-1;
aux[j].poz=j;
}
sort(aux+1,aux+n+1,cmp);
for (j=1; j<=n; ++j)
if (aux[j].s1==aux[j-1].s1&&aux[j].s2==aux[j-1].s2) p[aux[j].poz][i]=p[aux[j-1].poz][i];
else p[aux[j].poz][i]=j;
}
for (i=1; i<=n; ++i) ind[p[i][log]]=i;
for (i=1; i<=n-d; ++i) rez=max(rez,prefix(ind[i],ind[i+d-1]));
fout<<rez;
return(0);
}