Pagini recente » Cod sursa (job #271876) | Cod sursa (job #2754529) | Cod sursa (job #451118) | Istoria paginii runda/simulare_jmekera_1/clasament | Cod sursa (job #1517350)
#include <cstdio>
#include <algorithm>
#define LIM 30407
#define log2 17
using namespace std;
int n, k;
char s[LIM];
int suffix[log2][LIM];
struct dinamica
{
int st;
int dr;
int pos;
} v[LIM];
bool cmp(const dinamica &a, const dinamica &b)
{
if(a.st != b.st) return (a.st < b.st);
return (a.dr < b.dr);
}
inline void string_convert()
{
for(int i = 1; i<= n; ++i)
{
if(s[i] >= 'a' && s[i] <= 'z') {s[i] = s[i] - 'a' + 1;continue;}
if(s[i] >= 'A' && s[i] <= 'Z') {s[i] = s[i] - 'A' + 30;continue;}
if(s[i] >= '0' && s[i] <= '9') {s[i] = s[i] - '0' + 60;continue;}
s[i] = -1;
}
}
inline void construct_suffix_array()
{
for(int i = 1; i<= n; ++i) suffix[0][i] = s[i];
for(int pas = 1; (1<<(pas-1)) < n; ++pas)
{
for(int i = 1; i<= n; ++i)
{
v[i].st = suffix[pas-1][i];
v[i].dr = suffix[pas-1][i + (1<<(pas-1))];
v[i].pos = i;
}
sort(v+1, v+n+1, cmp);
suffix[pas][v[1].pos] = 1;
for(int i = 2; i <= n; ++i)
{
if(v[i].st == v[i-1].st && v[i].dr == v[i-1].dr) suffix[pas][v[i].pos] = suffix[pas][v[i-1].pos];
else suffix[pas][v[i].pos] = i;
}
}
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d", &n, &k);
scanf("%s", s+1);
string_convert();
construct_suffix_array();
printf("0\n");
return 0;
}