Pagini recente » Cod sursa (job #1496045) | Cod sursa (job #755096) | Cod sursa (job #2714374) | Cod sursa (job #2477587) | Cod sursa (job #2642471)
#include <bits/stdc++.h>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[100005];
int n,k,sa[25][17005],Log2[100005],suffix[100005];
pair<pair<int,int>,int> key[100005];
int LCP(int i, int j)
{
int rez=0;
int m=n-max(i,j)+1;
for(int p=Log2[m];p>=0;p--)
{
if(sa[p][i]==sa[p][j])
{
rez+=(1<<p);
i+=(1<<p);
j+=(1<<p);
}
}
return rez;
}
void suffix_array()
{
for(int i=2;i<=n;i++)
{
Log2[i]=1+Log2[i/2];
}
for(int i=1;i<=n;i++)
{
sa[0][i]=s[i];
}
for(int i=1;i<=Log2[n]+1;i++)
{
for(int j=1;j<=n;j++)
{
key[j]={{sa[i-1][j],sa[i-1][j+(1<<(i-1))]},j};
}
sort(key+1,key+n+1);
int cnt=0;
for(int j=1;j<=n;j++)
{
if(key[j].first!=key[j-1].first)
{
++cnt;
}
sa[i][key[j].second]=cnt;
}
}
}
int main()
{
f>>n>>k;
if(k==1)
{
g<<n<<'\n';
return 0;
}
for(int i=1;i<=n;i++)
{
f>>s[i];
}
suffix_array();
for(int i=1;i<=n;i++)
{
suffix[sa[Log2[n]+1][i]]=i;
}
int Max=0;
for(int i=1;i<=n;i++)
{
Max=max(Max,LCP(suffix[i],suffix[i+k-1]));
}
g<<Max<<'\n';
return 0;
}