Pagini recente » Cod sursa (job #1667943) | Cod sursa (job #1590019) | Cod sursa (job #1543155) | Cod sursa (job #307983) | Cod sursa (job #454707)
Cod sursa(job #454707)
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#define NMAX 17000
#define INF -1
typedef struct
{
int half1, half2, val;
}
SUF;
using namespace std;
int size, cnt, k;
char text[NMAX], word[100];
SUF l[16][NMAX];
int arr[16][NMAX];
int sufCmp(const SUF& lVal, const SUF& rVal)
{
return lVal.half1 != rVal.half1 ? lVal.half1 < rVal.half1 : lVal.half2 < rVal.half2;
}
void buildSuffixArray()
{
for (int i = 0; i < size; ++i)
{
arr[0][i] = text[i] <= 'Z' ? text[i] - 'A' : text[i] - 'a' + 26;
l[0][arr[0][i]].val = i;
}
for (int lg = 0; lg < 15; ++lg)
{
for (int i = 0; i < size; ++i)
l[lg + 1][i].half1 = arr[lg][i], l[lg + 1][i].half2 = i + (1 << lg) < size ? arr[lg][i + (1 << lg)] : INF, l[lg + 1][i].val = i;
sort(l[lg + 1], l[lg + 1] + size, sufCmp);
for (int i = 0; i < size; ++i)
arr[lg + 1][l[lg + 1][i].val] = (i != 0 && l[lg + 1][i].half1 == l[lg + 1][i - 1].half1 && l[lg + 1][i].half2 == l[lg + 1][i - 1].half2) ? arr[lg + 1][l[lg + 1][i - 1].val] : i;
}
}
int lcp(int i1, int i2)
{
int len = 0;
for (cnt = 15; cnt >= 0 && i1 < size && i2 < size; --cnt)
if (arr[cnt][l[cnt][i1].val] == arr[cnt][l[cnt][i2].val])
len += 1 << cnt, i1 += 1 << cnt, i2 += 1 << cnt;
return len;
}
int main()
{
FILE *fin = fopen("substr.in", "r"), *fout = freopen("substr.out", "w", stdout);
fscanf(fin, "%d %d\n", &size, &k);
for (int i = 0; i < size; ++i) fscanf(fin, "%s",text);
buildSuffixArray();
int best = 0, len;
for (int i = 0; i < size - k; ++i)
if (len = lcp(i, i + k - 1)) best = max(best, len);
printf("%d\n", best);
return 0;
}