Pagini recente » Cod sursa (job #1794018) | Istoria paginii runda/007/clasament | Cod sursa (job #295419) | Cod sursa (job #625958) | Cod sursa (job #1758833)
#include <iostream>
#include<fstream>
#include<algorithm>
#include<climits>
using namespace std;
int t,i,n,m,cnt,lev,level,a[17][16500],x,mx,val,k,ap[258],key,ke[258];
char s[67000];
struct suffix
{
int unu,doi,poz;
}l[16500];
bool comp(suffix la,suffix lb)
{
if(la.unu==lb.unu) return la.doi<lb.doi;
return la.unu<lb.unu;
}
int lcp(int x,int y)
{
t=min(n-x+1,n-y+1);
val=0;lev=level;
while(val<=t&&lev>=0)
{
if(a[lev][x]==a[lev][y])
x+=(1<<lev),y+=(1<<lev),val+=(1<<lev);
lev--;
}
return val;
}
int main()
{
ifstream f("substr.in");
ofstream g("substr.out");
f>>n>>k;
for(i=1;i<=n;i++)
{f>>s[i];ap[s[i]]=1;}
key=1;l[0].unu=-1;
for(i=0;i<=CHAR_MAX;i++)
{
if(ap[i])
{
ke[i]=key;
key++;
}
}
for(i=1;i<=n;i++)
{
a[0][i]=ke[s[i]];
}
for(cnt=1;(1<<(cnt-1))<=n;cnt++)
{
for(i=1;i<=n;i++)
{
l[i].unu=a[cnt-1][i];
l[i].doi=a[cnt-1][i+(1<<(cnt-1))];
l[i].poz=i;
}
sort(l+1,l+n+1,comp);
key=0;
for(i=1;i<=n;i++)
{
if((l[i].unu!=l[i-1].unu)||(l[i].doi!=l[i-1].doi))
key++;
a[cnt][l[i].poz]=key;
}
level=cnt;
}
for(i=1;i<=n-k+1;i++)
{
x=lcp(l[i].poz,l[i+k-1].poz);
if(x>mx) mx=x;
}
g<<mx;
return 0;
}