Pagini recente » Cod sursa (job #2242832) | Cod sursa (job #35124) | Cod sursa (job #424808) | Cod sursa (job #3216617) | Cod sursa (job #1338939)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
int line;
char s[111111];
int n,a[22][111111],x[111111];
int lcp(int x, int y)
{
int i,pas=16;
for(i=0;pas>=0;pas--)
{
if((1<<pas)>=n)
continue;
if(a[pas][x]==a[pas][y])
{
x+=(1<<pas);
y+=(1<<pas);
i+=(1<<pas);
if(x>=n || y>=n)
return i;
}
}
return i;
}
bool cmp(int x, int y)
{
//cout<<y<<" "<<x<<"\n";
if(a[line-1][x]<a[line-1][y])
return true;
if(a[line-1][x]>a[line-1][y])
return false;
if(y+(1<<(line-1))>=n)
return false;
if(x+(1<<(line-1))>=n)
return true;
return a[line-1][x+(1<<(line-1))]<a[line-1][y+(1<<(line-1))];
}
int main()
{
int i,j,put,k;
ifstream in("substr.in");
ofstream out("substr.out");
in>>n>>k;
in.getline(s,11);
in.getline(s,111111);
n=strlen(s);
for(i=0;i<n;++i)
{
a[0][i]=s[i];
}
for(i=1;(1<<i)<=2*n;++i)
{
for(j=0;j<n;++j)
{
x[j]=j;
}
line=i;
sort(x,x+n,cmp);
a[line][x[0]]=1;
for(j=1;j<n;++j)
{
if(cmp(x[j-1],x[j])==true)
a[line][x[j]]=a[line][x[j-1]];
else
a[line][x[j]]=a[line][x[j-1]]+1;
}
}
//linie=i-1
int p, maxim=0;
--k;
for(i=k;i<n;++i)
{
p=lcp(x[i],x[i-k]);
if(p>maxim)
maxim=p;
cout<<p<<" ";
}
out<<maxim<<"\n";
return 0;
}