269 lines
3.8 KiB
C
269 lines
3.8 KiB
C
#include "solve.h"
|
|
|
|
int t1_solve(char ** a, int n, char *s) {
|
|
int i, j;
|
|
for (i = 0, j = 0; i < n; ++i) {
|
|
if (strcmp(a[i], s) >= 0)
|
|
{
|
|
if (i != j) a[j] = a[i];
|
|
j++;
|
|
} else free(a[i]);
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
int t2_solve(char ** a, int n, char *s) {
|
|
int i, j;
|
|
for (i = 0, j = 0; i < n; ++i) {
|
|
if (!strstr(s, a[i])) {
|
|
if (i != j)
|
|
{
|
|
a[j] = a[i];
|
|
}
|
|
j++;
|
|
} else free(a[i]);
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
int t3_solve(char ** a, int n, char *s) {
|
|
int i, j;
|
|
for (i = 0, j = 0; i < n; ++i) {
|
|
if (strpbrk(s, a[i])) {
|
|
if (i != j)
|
|
{
|
|
a[j] = a[i];
|
|
}
|
|
j++;
|
|
} else {
|
|
free(a[i]);
|
|
}
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
int t4_solve(char ** a, int n, char *s) {
|
|
size_t len_s = strlen(s);
|
|
int i, j, k;
|
|
for (i = 0, j = 0, k = 0; i < n; ++i) {
|
|
if (len_s <= strlen(a[i])) {
|
|
if (i != j)
|
|
{
|
|
a[j] = a[i];
|
|
}
|
|
j++;
|
|
k = 0;
|
|
} else {
|
|
if (k == 0) {
|
|
if (i != j)
|
|
a[j] = a[i];
|
|
j++;
|
|
} else {
|
|
free(a[i]);
|
|
}
|
|
k++;
|
|
}
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
int t5_solve(char ** a, int n, char *s) {
|
|
int i, j, k;
|
|
for (i = 0, j = 0, k = 0; i < n; ++i) {
|
|
if (!check(a[i], s)) {
|
|
if (i != j)
|
|
{
|
|
a[j] = a[i];
|
|
}
|
|
j++;
|
|
k = 0;
|
|
} else {
|
|
if (k == 0) {
|
|
if (i != j)
|
|
a[j] = a[i];
|
|
j++;
|
|
} else {
|
|
free(a[i]);
|
|
}
|
|
k++;
|
|
}
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
|
|
bool check(char *a, char *s) {
|
|
int i;
|
|
int len_s = (int)strlen(s);
|
|
int len_a = (int)strlen(a);
|
|
int diff = len_a - len_s;
|
|
|
|
if (diff < 0) return false;
|
|
|
|
for (i = (len_a - 1); i > (diff - 1); --i) {
|
|
if (a[i] != s[i - diff]) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int t6_solve(char ** a, int n, char *s) {
|
|
int i, j, k;
|
|
for (i = 0, j = 0, k = 0; i < n; ++i) {
|
|
if (strpbrk(a[i], s)) {
|
|
if (k > 1)
|
|
{
|
|
for (int x = 2; x < k; x++) free(a[i - x]);
|
|
a[j++] = a[i - 1];
|
|
}
|
|
|
|
if (i != j)
|
|
{
|
|
a[j] = a[i];
|
|
}
|
|
j++;
|
|
k = 0;
|
|
} else {
|
|
if (k == 0) {
|
|
if (i != j)
|
|
a[j] = a[i];
|
|
j++;
|
|
}
|
|
k++;
|
|
}
|
|
}
|
|
|
|
if (k > 1)
|
|
{
|
|
for (int x = 2; x < k; x++) free(a[i - x]);
|
|
a[j++] = a[i - 1];
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
int t7_solve(char ** a, int n, char *s) {
|
|
bool fl_lst = false, fl_cur = false, fl_nxt = false;
|
|
int i, j;
|
|
|
|
if (strcmp(a[0], s) < 0) fl_cur = true;
|
|
|
|
for (i = 1, j = 0; i < n; ++i) {
|
|
if (strcmp(a[i], s) < 0) {
|
|
fl_lst = true;
|
|
fl_nxt = true;
|
|
}
|
|
|
|
if (!fl_lst) {
|
|
if (j != (i-1)) {
|
|
a[j] = a[i-1];
|
|
}
|
|
j++;
|
|
} else {
|
|
free(a[i-1]);
|
|
}
|
|
|
|
fl_lst = fl_cur;
|
|
fl_cur = fl_nxt;
|
|
fl_nxt = false;
|
|
}
|
|
|
|
if (fl_lst)
|
|
{
|
|
free(a[i-1]);
|
|
} else {
|
|
a[j++] = a[i-1];
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
|
|
int t8_solve(char ** a, int n, char *s) {
|
|
bool fl_lst = false, fl_cur = false, fl_nxt = false;
|
|
int i, j;
|
|
|
|
fl_cur = is_inside(a[0], s);
|
|
|
|
for (i = 1, j = 0; i < n; ++i) {
|
|
if (is_inside(a[i], s)) {
|
|
fl_lst = true;
|
|
fl_nxt = true;
|
|
}
|
|
|
|
if (!fl_lst) {
|
|
if (j != (i-1)) {
|
|
a[j] = a[i-1];
|
|
}
|
|
j++;
|
|
} else {
|
|
free(a[i-1]);
|
|
}
|
|
|
|
fl_lst = fl_cur;
|
|
fl_cur = fl_nxt;
|
|
fl_nxt = false;
|
|
}
|
|
|
|
if (fl_lst)
|
|
{
|
|
free(a[i-1]);
|
|
} else {
|
|
a[j++] = a[i-1];
|
|
}
|
|
|
|
for (i = j; i < n; ++i) a[i] = 0;
|
|
|
|
return j;
|
|
}
|
|
|
|
bool is_inside(char *a, char *s)
|
|
{
|
|
int len_s = (int)strlen(s);
|
|
int len_a = (int)strlen(a);
|
|
int i, j;
|
|
|
|
if (len_s < len_a) return false;
|
|
|
|
for (i = 0; i < len_s; ++i) {
|
|
if (!ccmp(a[0], s[i])) {
|
|
if (len_a > (len_s-len_a)) return false;
|
|
|
|
for (j = 0; j < len_a; ++j) {
|
|
if (ccmp(a[j], s[i + j]) != 0) break;
|
|
}
|
|
|
|
if (j == len_a) return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int ccmp(char a, char b) {
|
|
if (LOWER(a)) a -= TO_UPPER;
|
|
if (LOWER(b)) b -= TO_UPPER;
|
|
|
|
if (a < b) return -1;
|
|
if (a > b) return 1;
|
|
return 0;
|
|
}
|