Pagini recente » Cod sursa (job #844150) | Cod sursa (job #2414279) | Cod sursa (job #1208990) | Cod sursa (job #980418) | Cod sursa (job #1007515)
#include <fstream>
#include <cstring>
#include <map>
#define Mod1 2147483647
#define Base1 513
#define Nmax 16500
using namespace std;
int n,K;
char s[Nmax];
map<int ,int >a;
inline bool Verif(const int k)
{
int i,Hash1 = 0,P = 1;
a.clear();
for(i = 1;i <= k; ++i)
{
Hash1 = (1LL*Hash1*Base1+s[i])%Mod1;
if(i < k)
P = (1LL*P*Base1)&Mod1;
}
++a[Hash1];
for(i=k+1;i<=n;++i)
{
Hash1 = ((Hash1 - (1LL*s[i - k] * P) % Mod1 + Mod1)*1LL * Base1 + s[i]) % Mod1;
if(++a[Hash1] >= K)
return true;
}
return false;
}
int main()
{
ifstream f("substr.in");
f>>n>>K>>(s+1);
f.close();
int Left = 0,Right = n,Middle, sol = 0;
while(Left<=Right)
{
Middle = (Left+Right)>>1;
if(Verif(Middle))
{
sol = Middle;
Left = Middle + 1;
}
else
Right = Middle-1;
}
ofstream g("substr.out");
g<<sol<<"\n";
g.close();
return 0;
}