Pagini recente » Cod sursa (job #2455638) | Cod sursa (job #3131767) | Cod sursa (job #2911183) | Cod sursa (job #107563) | Cod sursa (job #1401122)
#include <iostream>
#include <fstream>
#include <string>
#include <tr1/unordered_map>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
const int maxn = 16384 + 10;
int N,K,sol;
char s[maxn];
tr1 :: unordered_map < string , int > Q;
//caut binar lungimea sirului care apare de K ori si are lungime mid
void bsearch(int st,int dr){
bool ok;
while(st<dr){
int mid = (st+dr)>>1;
int i,j;
string str;
for(i=1;i<=N-mid+1;i++)
{
for(j=i;j<=i+mid;j++)
str+=s[j];
Q[str]++;
str.erase(0,mid+1);
}
tr1 :: unordered_map < string , int > :: iterator it;
ok=0;
for(it=Q.begin();it!=Q.end();it++)
if( (it->second) == K)
{
if(sol<(it->first).size())
sol=(it->first).size();
st=mid+1;
ok=1;
}
if(!ok)
dr=mid-1;
}
}
int main()
{
in>>N>>K;
int i;
for(i=1;i<=N;i++)
in>>s[i];
bsearch(1,N);
out<<sol<<" ";
return 0;
}