Pagini recente » Cod sursa (job #408951) | Cod sursa (job #1873766) | Cod sursa (job #1259314) | Cod sursa (job #1083690) | Cod sursa (job #2171628)
#include <iostream>
#include<vector>
#include<fstream>
using namespace std;
#define N 16400
#define M 1999
#define pb push_back
#define f first
#define s second
#define mp make_pair
int ans,i,it,n,k,v[255],P[N];
string s;
vector<pair<int,int> >a[M];
vector<int>e;
inline int Key(int x)
{
if(x<2000)return x;
return x%M;
}
inline bool egal(int x,int y,int dim)
{
for(int t=0;t<dim;++t)
if(s[x+t]!=s[y+t])return 0;
return 1;
}
bool check(int m)
{
int x=0,j,mx=1;
while(!e.empty())
{
x=e[e.size()-1];
e.pop_back();
a[x].clear();
}
bool ok;
for(it=0;it<m;++it)
x=Key(x+v[s[it]]*P[it]);
a[x].pb(mp(0,1));e.pb(x);
for(it=m;it<n;++it)
{
x/=62;
x=Key(1999+x+Key(v[s[it]]*P[m-1]) );
ok=false;//if(m==2)cout<<it<<" "<<x<<'\n';
for(j=0;!ok&&j<a[x].size();++j)
if(egal(it-m+1,a[x][j].f,m))
{
++a[x][j].s;
ok=true;
mx=max(mx,a[x][j].s);
if(mx>=k)return 1;
}
if(!ok)
{
if(!a[x].size())e.pb(x);
a[x].pb(mp(it-m+1,1));
}
}
return 0;
}
int main()
{
i=(int)'a';
for(it=0;it<26;++it)v[it+i]=it;
i=(int)'A';
for(it=0;it<26;++it)v[it+i]=26+it;
i=(int)'0';
for(it=0;it<10;++it)v[it+i]=52+it;
ifstream fin("substr.in");
ofstream fout("substr.out");
fin.sync_with_stdio(false);
fout.sync_with_stdio(false);
fin>>n>>k;
fin>>s;
if(k==1)
{
fout<<n;
return 0;
}
P[0]=1;
for(i=1;i<n;++i)P[i]=Key(P[i-1]*62);
ans=0;
for(i=n;i;i>>=1)
{
while(i+ans<=n && check(i+ans))
ans+=i;
}
fout<<ans;
return 0;
}