Cod sursa(job #30612)
#include <fstream>
#include <string.h>
using namespace std;
int n, m, k;
char *p[30001], t[30001];
char pa[30001];
int pr[30001];
int pos[30001];
int lung, nr;
char *aux;
int i, j, imax;
void KMP();
void Prefix();
void Quick(int st, int dr);
int Common(char *p1, char* p2);
int main()
{
ifstream fin("substr.in");
ofstream fout("substr.out");
fin >> k;
fin.get();
while ( (t[n] = fin.get() ) != EOF )
{
p[n] = &t[n];
n++;
}
t[n] = '\0';
fin.close();
Quick(0, n-1);
for ( i = 0; i < n-k; i++ )
{
m = Common(p[i], p[i+k]);
if ( m > lung )
lung = m, imax = i;
}
m = lung;
fout << lung << endl;
fout.close();
}
void Quick(int st, int dr)
{
int i = st-1;
int j = dr+1;
int mij = st;
do
{
do { i++; } while ( strcmp(p[i], p[mij]) < 0 );
do { j--; } while ( strcmp(p[mij], p[j]) < 0 );
if ( i <= j )
{
aux = p[i];
p[i] = p[j];
p[j] = aux;
}
} while ( i <= j );
if ( i < dr ) Quick(i, dr);
if ( st < j ) Quick(st, j);
}
int Common(char* p1, char* p2)
{
int L = 0;
for ( ; *p1 && (*p1 == *p2); L++, p1++, p2++ );
return L;
}