Pagini recente » Cod sursa (job #1924892) | Cod sursa (job #3201430) | Cod sursa (job #282171) | Cod sursa (job #1830882) | Cod sursa (job #1558664)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int ans, N, K, order[17009];
char sir[17009];
class SuffixArrays
{
public:
int N;
void fix_val (int pos, int val)
{
dp[0][pos] = val;
a[pos].second = pos;
}
void RunIt (int order[])
{
for (int i=0; (1<<i) <= N; i++)
maxlg = i;
for (int i=1; i<=maxlg; i++)
{
int L = (1 << (i - 1));
for (int j=1; j<=N; j++)
{
int P = a[j].second;
a[j].first.first = dp[i - 1][P];
if (P + L <= N) a[j].first.second = dp[i - 1][P + L];
else a[j].first.second = 0;
}
sort (a + 1, a + N + 1);
int curr = 0;
for (int j=1; j<=N; j++)
{
if (j == 1 || a[j].first != a[j - 1].first) curr ++;
dp[i][a[j].second] = curr;
}
}
for (int i=1; i<=N; i++)
order[i] = a[i].second;
}
int LCP (int x, int y)
{
if (x == y) return N - x + 1;
int ans = 0;
for (int i=maxlg; i>=0; i--)
if (x + (1 << i) - 1 <= N && y + (1 << i) - 1 <= N && dp[i][x] == dp[i][y])
x += 1 << i, y += 1 << i, ans += 1 << i;
return ans;
}
private:
int maxlg, dp[16][17009];
pair < pair < int, int > , int > a[17009];
}sa;
int main ()
{
freopen ("substr.in", "r", stdin);
freopen ("substr.out", "w", stdout);
scanf ("%d %d\n", &N, &K), sa.N = N;
gets (sir + 1);
for (int i=1; i<=N; i++)
sa.fix_val (i, sir[i]);
sa.RunIt (order);
for (int i=1; i <= N - K + 1; i++)
{
int curr = sa.LCP (order[i], order[i + K - 1]);
if (curr > ans) ans = curr;
}
printf ("%d\n", ans);
return 0;
}