Pagini recente » Cod sursa (job #394577) | Cod sursa (job #1125641) | Cod sursa (job #1379996) | Cod sursa (job #863661) | Cod sursa (job #1053508)
#include<fstream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,K,sol,lg;
char A[17000];
struct Element{int nr[2],poz;};
Element v[17000];
int Poz[15][17000],arrays[17000];
inline bool Sortare(Element A,Element B)
{
if(A.nr[0]==B.nr[0])
return A.nr[1]<B.nr[1];
return A.nr[0]<B.nr[0];
}
inline int PrefixComun(int x,int y)
{
if(x==y)
return n-x;
int k=lg,rez=0;
while(k>=0 && x<n && y<n)
{
if(Poz[k][x]==Poz[k][y])
{
x+=(1<<k);
y+=(1<<k);
rez+=(1<<k);
}
k--;
}
return rez;
}
inline int Code(char c)
{
if('a'<=c && c<='z')
return c-'a';
if('A'<=c && c<='Z')
return c-'A'+26;
if('0'<=c && c<='9')
return c-'0'+52;
return 0;
}
int main()
{
int i,k;
ifstream fin("substr.in");
fin>>n>>K;
fin>>A;
fin.close();
for(i=0;i<n;i++)
Poz[0][i]=Code(A[i]);
lg=0;
while((1<<lg)<n)
lg++;
for(k=1;k<=lg;k++)
{
for(i=0;i<n;i++)
{
v[i].nr[0]=Poz[k-1][i];
if(i+(1<<(k-1))<n)
v[i].nr[1]=Poz[k-1][i+(1<<(k-1))];
else
v[i].nr[1]=-1;
v[i].poz=i;
}
sort(v,v+n,Sortare);
for(i=0;i<n;i++)
{
if(i>0 && v[i].nr[0]==v[i-1].nr[0] && v[i].nr[1]==v[i-1].nr[1])
Poz[k][v[i].poz]=Poz[k][v[i-1].poz];
else
Poz[k][v[i].poz]=i;
}
}
for(i=0;i<n;i++)
arrays[Poz[lg][i]]=i;
for(i=0;i<=n-K;i++)
sol=max(sol,PrefixComun(arrays[i],arrays[i+K-1]));
ofstream fout("substr.out");
fout<<sol<<"\n";
fout.close();
return 0;
}