Pagini recente » Cod sursa (job #1018219) | Cod sursa (job #1209187) | Cod sursa (job #297962) | Cod sursa (job #1136937) | Cod sursa (job #2594315)
#include<fstream>
#include<cstring>
#include<algorithm>
#include<deque>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[16386];
int n,p[16386],pp[16386],lcp[16386],poz[16386],v[16386];
pair<int,int>q[16386],qq[16386];
deque<int>dq;
void sortare()
{
int i,l,j,k=1;
for(i=1;i<=n;i++)
v[s[i]-'a'+1]++;
for(i=1;i<=26;i++)
v[i]+=v[i-1];
for(i=n;i>=1;i--)
p[v[s[i]-'a'+1]--]=i;
for(i=1;i<=n;i++)
poz[p[i]]=i,v[i]=0;
for(i=1;i<=n;i++)
{
q[i].first=k;
if(s[p[i]]!=s[p[i+1]])
k++;
}
for(l=1;l<n;l*=2)
{
for(i=1;i<=n;i++)
{
j=p[i]+l;
if(j>n)
j=n+1;
q[i].second=q[poz[j]].first;
}
for(i=1;i<=n;i++)
v[q[i].second]++;
for(i=1;i<=n;i++)
v[i]+=v[i-1];
for(i=n;i>=1;i--)
pp[v[q[i].second]]=p[i],qq[v[q[i].second]--]=q[i];
for(i=1;i<=n;i++)
v[i]=0;
for(i=1;i<=n;i++)
v[qq[i].first]++;
for(i=1;i<=n;i++)
v[i]+=v[i-1];
for(i=n;i>=1;i--)
p[v[qq[i].first]]=pp[i],q[v[qq[i].first]--]=qq[i];
for(i=1;i<=n;i++)
poz[p[i]]=i,v[i]=0;
k=1;
for(i=1;i<=n;i++)
{
if(q[i]==q[i+1])
q[i].first=k;
else
q[i].first=k,k++;
}
}
}
void kasai()
{
int i,x=0,j,i1,i2;
for(i=1;i<=n;i++)
{
x--;
if(x<0)
x=0;
j=poz[i];
if(j!=n)
{
i1=i;
i2=p[j+1];
i1+=x;
i2+=x;
while(x<n&&i1<=n&&i2<=n&&s[i1]==s[i2])
{
x++;
i1++;
i2++;
}
lcp[j]=x;
}
else
x=0;
}
}
int main()
{
int i,sol=0,k;
f>>n>>k;
f.get();
f.getline(s+1,16385);
sortare();
kasai();
k--;
for(i=1;i<=n-1;i++)
{
while(!dq.empty()&&lcp[i]<lcp[dq.back()])
dq.pop_back();
dq.push_back(i);
if(dq.front()<=i-k)
dq.pop_front();
sol=max(sol,lcp[dq.front()]);
}
g<<sol;
return 0;
}