Cod sursa(job #757497)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 12 iunie 2012 12:29:30
Problema Substr Scor 70
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.37 kb

#include <fstream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;

long N,K;
char S[18000];

long Best;

long vec[63] = {0,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                  'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                  '0','1','2','3','4','5','6','7','8','9'};

long pp[256];

void Make(void)
{
 for (long i = 0;i < 63;i += 1)
  {
   pp[vec[i]] = i;
  }
}

void Rezolva(vector<long> &V,long L)
{
 vector<long> *W = new vector<long>[63];
 long i;
 for (i = 0;i < 63;i += 1)
  {
   W[i].reserve(V.size());
  }
 for (i = 0;i < V.size();i += 1)
  {
   W[pp[S[V[i] + L]]].push_back(V[i]);
  }
 if (W[0].size() >= K)
   {
    if (L > Best)
      {
       Best = L;
      }
   }
 for (i = 1;i < 63;i += 1)
  {
   if (W[i].size() >= K)
     {
      if ((L + 1) > Best)
        {
         Best = L + 1;
        }
      Rezolva(W[i],L + 1);
     }
  }
 delete[] W;
}

int main(void)
{
 Make();
 fstream fin("substr.in",ios::in);
 fstream fout("substr.out",ios::out);
 long i;
 vector<long> W;
 fin >> N >> K >> S;
 W.reserve(N);
 for (i = 0;i < N;i += 1)
  {
   W.push_back(i);
  }
 Rezolva(W,0);
 fout << Best;
 fin.close();
 fout.close();
 return 0;
}