From ba2d3e9bf64b21082dbe4fc10240de2ccb14724c Mon Sep 17 00:00:00 2001 From: JISAUAY Date: Tue, 25 Feb 2025 17:04:18 -0600 Subject: [PATCH] working on the last problem for A3 --- LEXISORT/main.py | 69 ++++++++++++++++++++ MAIN8_C/MAIN8_C.cpp | 0 MAIN8_C/a.out | Bin 0 -> 17104 bytes NAJPF/NAJPF.cpp | 19 +++--- NAJPF/NAJPF.py | 81 ++++++++++++++++++++--- NAJPF/main | Bin 32536 -> 32808 bytes STRMATCH.cpp | 153 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 304 insertions(+), 18 deletions(-) create mode 100644 LEXISORT/main.py mode change 100755 => 100644 MAIN8_C/MAIN8_C.cpp create mode 100644 MAIN8_C/a.out mode change 100755 => 100644 NAJPF/main create mode 100644 STRMATCH.cpp diff --git a/LEXISORT/main.py b/LEXISORT/main.py new file mode 100644 index 0000000..c34f9c3 --- /dev/null +++ b/LEXISORT/main.py @@ -0,0 +1,69 @@ +def merge(l: list, start: int, end: int, end2: int) -> None: + + n1 = end - start + 1 + n2 = end2 - end + + left = [0] * (n1) + right = [0] * (n2) + + for i in range(n1): + left[i] = l[start + i] + + for i in range(n2): + right[i] = l[end + 1 + i] + + i = 0 + j = 0 + k = start + + while i < n1 and j < n2: + if left[i] <= right[j]: + l[k] = left[i] + i += 1 + else: + l[k] = right[j] + j += 1 + k += 1 + + while i < n1: + l[k] = left[i] + j += 1 + k += 1 + + while j < n2: + l[k] = right[j] + j += 1 + k += 1 + +def merge_sort(l: list, left: int, right: int) -> None: + if left < right: + + m = left + (right - 1) // 2 + + merge_sort(l, left, m) + merge_sort(l, m + 1, right) + merge(l, left, m, right) + + +def main(): + lines: list[str] = [] + test_cases = int(input()) + while (test_cases != 0): + n = int(input()) + + while (n != 0): + + lines.append(input()) + + n -= 1 + + merge_sort(lines, 0, len(lines) - 1) + for line in lines: + print(line) + + lines = [] + + test_cases -= 1 + +if __name__ == "__main__": + main() diff --git a/MAIN8_C/MAIN8_C.cpp b/MAIN8_C/MAIN8_C.cpp old mode 100755 new mode 100644 diff --git a/MAIN8_C/a.out b/MAIN8_C/a.out new file mode 100644 index 0000000000000000000000000000000000000000..58725c68475988e52ab508f4a6b767455060836e GIT binary patch literal 17104 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 literal 0 HcmV?d00001 diff --git a/NAJPF/NAJPF.cpp b/NAJPF/NAJPF.cpp index bcfaede..14c4ff1 100644 --- a/NAJPF/NAJPF.cpp +++ b/NAJPF/NAJPF.cpp @@ -13,7 +13,7 @@ int main() { while (test_cases != 0) { size_t pos = 0; - int i = 1; + int i = 0; int count = 0; std::vector positions; @@ -22,12 +22,10 @@ int main() { std::string test_case = test_case2; std::string token = token2; - while ((pos = test_case.find(token)) != std::string::npos) { + while ((pos = test_case.find(token, i)) != std::string::npos) { + positions.push_back(pos + 1); - positions.push_back(pos + i); - - i += pos + 1; - test_case.erase(0, pos + 1); + i = pos + 1; count++; } @@ -36,11 +34,16 @@ int main() { } else { std::printf("%d\n", count); for (size_t pos : positions) { - std::printf("%d ", pos); + if (pos != positions.back()) { + std::printf("%d ", pos); + } else { + std::printf("%d", pos); + } } } - std::printf("\n\n"); + if (test_cases != 1) + std::printf("\n"); test_cases--; } diff --git a/NAJPF/NAJPF.py b/NAJPF/NAJPF.py index 7c25750..14a3e70 100644 --- a/NAJPF/NAJPF.py +++ b/NAJPF/NAJPF.py @@ -1,20 +1,81 @@ +def kmp_table(S: str, W: str) -> list[int]: + T = [0] * len(S) + + pos = 1 + cnd = 0 + + while pos < len(W): + if W[pos] == W[cnd]: + cnd += 1 + T[pos] = cnd + pos += 1 + else: + if cnd != 0: + cnd = T[cnd - 1] + else: + T[pos] = 0 + pos += 1 + + return T + +# Returns a list of positions (indexes) +def kmp(S: str, W: str) -> list[int]: + + if W not in S: + return [] + + j = 0 + k = 0 + T = kmp_table(S, W) + P = [] # Positions List + + while j < len(S): + if W[k] == S[j]: + j += 1 + k += 1 + if k == len(W): + P.append(j - k) + k = T[k - 1] + else: + if k != 0: + k = T[k - 1] + else: + j += 1 + + return P + +def find_search(S: str, W: str) -> list[int]: + pos = 0 + i = 0 + count = 0 + positions = [] + while (pos := S.find(W, i)) != -1: + i = pos + 1 + positions.append(pos + 1) + count += 1 + + return positions + def main(): test_cases = int(input()) + while (test_cases != 0): test_case, token = input().split() + positions = kmp(test_case, token) - if token in test_case: - - i = 1 - while token in test_case: - print(f'{test_case.find(token) + i} ',end='') - test_case = test_case.replace(token, '', 1) - i += len(token) - - else: + if len(positions) == 0: print("Not Found", end='') + else: + print(len(positions)) + for pos in positions: + if pos != positions[-1]: + print(f'{pos + 1} ', end='') + else: + print(f'{pos + 1}', end='') + + if test_cases != 1: + print('\n') - print('\n') test_cases -= 1 if __name__ == '__main__': diff --git a/NAJPF/main b/NAJPF/main old mode 100755 new mode 100644 index 05d9d2272bfeb3b55bdf20a9e7b9ac40e3fae0d6..a19cca7970989d25feb81872a38ccf722e505014 GIT binary patch literal 32808 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 literal 32536 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 aHc4ElaupSi)1=M+n^q~Yz?H#;8vhRtF)9@R diff --git a/STRMATCH.cpp b/STRMATCH.cpp new file mode 100644 index 0000000..aaa5dbd --- /dev/null +++ b/STRMATCH.cpp @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include + +const int MAXS = 500000; +const int MAXC = 26; + + +int out[MAXS]; +int f[MAXS]; +int g[MAXS][MAXC]; + +int build_string_matcher(std::string arr[], int k) { + std::memset(out, 0, sizeof out); + std::memset(g, -1, sizeof g); + + int states = 1; + + for (int i = 0; i < k; ++i) + { + const std::string &word = arr[i]; + int currentState = 0; + + for (int j = 0; j < word.size(); ++j) + { + int ch = word[j] - 'a'; + + + if (g[currentState][ch] == -1) + g[currentState][ch] = states++; + + currentState = g[currentState][ch]; + } + + out[currentState] |= (1 << i); + } + + for (int ch = 0; ch < MAXC; ++ch) + if (g[0][ch] == -1) + g[0][ch] = 0; + + std::memset(f, -1, sizeof f); + + std::queue q; + + for (int ch = 0; ch < MAXC; ++ch) + { + if (g[0][ch] != 0) + { + f[g[0][ch]] = 0; + q.push(g[0][ch]); + } + } + + while (q.size()) + { + int state = q.front(); + q.pop(); + + for (int ch = 0; ch <= MAXC; ++ch) + { + if (g[state][ch] != -1) + { + int failure = f[state]; + + while (g[failure][ch] == -1) + failure = f[failure]; + + failure = g[failure][ch]; + f[g[state][ch]] = failure; + + out[g[state][ch]] |= out[failure]; + + q.push(g[state][ch]); + } + } + } + + return states; +} + +int find_next_state(int currentState, char nextInput) +{ + int answer = currentState; + int ch = nextInput - 'a'; + + + while (g[answer][ch] == -1) + answer = f[answer]; + + return g[answer][ch]; +} + +void search_words(std::string queries[], int k, std::string text) { + build_string_matcher(queries, k); + + int current_state = 0; + + int counts[k]; + + std::memset(counts, 0, sizeof counts); + + for (int i = 0; i < text.size(); i++) { + current_state = find_next_state(current_state, text[i]); + + if (out[current_state] == 0) + continue; + + for (int j = 0; j < k; j++) { + if (out[current_state] & (1 << j)) { + counts[j]++; + } + } + } + + for (int i = 0; i < k; i++) { + std::printf("%d\n", counts[i]); + } +} + + +int main() { + int N, Q; + std::string S, query; + + std::scanf("%d %d", &N, &Q); + + char c_s[N]; + std::fscanf(stdin, "%s", c_s); + S = c_s; + + std::string queries[Q]; + int i = 0; + int q_copy = Q; + char c_query[3000]; + while(q_copy != 0) { + + std::fscanf(stdin, "%s", c_query); + query = c_query; + queries[i] = query; + + i++; + q_copy--; + } + + search_words(queries, Q, S); + + return 0; +} + +