#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct
rotation {
int
index;
char
* suffix;
};
int
cmpfunc(
const
void
* x,
const
void
* y)
{
struct
rotation* rx = (
struct
rotation*)x;
struct
rotation* ry = (
struct
rotation*)y;
return
strcmp
(rx->suffix, ry->suffix);
}
char
** computeSuffixArray(
char
* input_text,
int
len_text)
{
int
i;
struct
rotation suff[len_text];
for
(i = 0; i < len_text; i++) {
suff[i].index = i;
suff[i].suffix = (input_text + i);
}
qsort
(suff, len_text,
sizeof
(
struct
rotation), cmpfunc);
char
** suffix_arr =
(
char
**)
malloc
(len_text *
sizeof
(
char
*));
for
(i = 0; i < len_text; i++) {
suffix_arr[i] =
(
char
*)
malloc
((len_text + 1) *
sizeof
(
char
));
strcpy
(suffix_arr[i], suff[i].suffix);
}
return
suffix_arr;
}
void
findValidPairs(
char
** suffix_arr,
int
n,
int
k)
{
int
curr_count = 1, i;
char
* prev_suff = (
char
*)
malloc
(n *
sizeof
(
char
));
for
(i = 0; i < n; i++) {
if
(
strlen
(suffix_arr[i]) < k) {
if
(i != 0 &&
strlen
(prev_suff) == k) {
printf
(
"(%s, %d)\n"
, prev_suff, curr_count);
curr_count = 1;}
strcpy
(prev_suff, suffix_arr[i]);
continue
;
}
if
(!(
memcmp
(prev_suff, suffix_arr[i], k))) {
curr_count++;
}
else
{
if
(i != 0 &&
strlen
(prev_suff) == k) {
printf
(
"(%s, %d)\n"
, prev_suff, curr_count);
curr_count = 1;
memcpy
(prev_suff, suffix_arr[i], k);
prev_suff[k] =
'\0'
;
}
else
{
memcpy
(prev_suff, suffix_arr[i], k);
prev_suff[k] =
'\0'
;
continue
;
}
}
memcpy
(prev_suff, suffix_arr[i], k);
prev_suff[k] =
'\0'
;
}
printf
(
"(%s, %d)\n"
, prev_suff, curr_count);
}
int
main()
{
char
input_text[] =
"geeksforgeeks"
;
int
k = 2;
int
len_text =
strlen
(input_text);
printf
(
"Input Text: %s\n"
, input_text);
char
** suffix_arr =
computeSuffixArray(input_text, len_text);
printf
(
"k-mers: \n"
);
findValidPairs(suffix_arr, len_text, k);
return
0;
}