Pagini recente » Cod sursa (job #860770) | Cod sursa (job #1854814) | Cod sursa (job #20890) | Cod sursa (job #669085) | Cod sursa (job #1507789)
#include <fstream>
#include <unordered_map>
#include <string>
using namespace std;
#define NMax 16400
ifstream f("substr.in");
ofstream g("substr.out");
int n,k;
string sir;
int sol;
const int P = 1003;
inline long long hashing(int a, int b)
{
long long r = 0;
for(int i=a;i<=b;++i) r = r * P + sir[i];
return r;
}
inline bool valid(int val)
{
unordered_map<long long, int> h;
unordered_map<long long, int>::iterator it;
int viz[NMax];
for(int i=0;i<=n;++i) viz[i] = 0;
int key = 0;
long long hs = hashing(0, val-1);
h[hs] = ++key;
long long PP = 1;
for(int i=1;i<val;++i) PP *= P;
for(int i=val;i<sir.size();++i)
{
hs -= sir[i-val] * PP;
hs = hs * P + sir[i];
it = h.find(hs);
if(it != h.end())
{
int x = (*it).second;
if(++viz[x] == k) return true;
}
else h[hs] = ++key;
}
return false;
}
inline void cautbin()
{
int st = 1, dr = n;
while(st<=dr)
{
int mij = ((st+dr)>>1);
if(valid(mij))
{
sol = max(sol, mij);
st = mij + 1;
}
else dr = mij - 1;
}
}
int main()
{
f>>n>>k>>sir;
--k;
cautbin();
g<<sol<<"\n";
f.close();
g.close();
return 0;
}