Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit14e41732ebea0d1f473e49193fc710dd5c3c73c0 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-05-22 13:00:42 +0300
Committer
 Syndamia <kamen@syndamia.com>
2023-05-22 13:00:42 +0300
Files334be5d26cce4064afcb7f926f0613287dc5e4fd
uni-projects-14e41732ebea0d1f473e49193fc710dd5c3c73c0.tar
uni-projects-14e41732ebea0d1f473e49193fc710dd5c3c73c0.tar.gz
uni-projects-14e41732ebea0d1f473e49193fc710dd5c3c73c0.zip
Parent6bbbbf7bbc7d3b1b3a5949ecda077be708df2af2 (diff)
[DAAP/H3] Added somewhat working solution
30/100 points
1 files changed, 75 insertions, 0 deletions
-rw-r--r--Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW3-Strings.cpp75
diff --git a/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW3-Strings.cpp b/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW3-Strings.cpp
new file mode 100644
index 0000000..1d26d1d
--- /dev/null
+++ b/Year 2/Design and analysis of algorithms/Practicum/Homeworks/HW3-Strings.cpp
@@ -0,0 +1,75 @@
+#include <iostream>
+using namespace std;
+
+typedef pair<long long, long long> Query;
+
+char S[2000005] = { '\0' };
+long long QN = 0;
+Query qs[2000005] = {{0,0}};
+long long mem[2000005] = { 0 };
+
+char* lastLeftMatching(char* c) {
+ char* l = c;
+ while (l != S && *(l-1) == *c) {
+ l--;
+ }
+ return l;
+}
+
+char* lastRightMatching(char* c) {
+ char* r = c;
+ while (*(r+1) == *c) {
+ r++;
+ }
+ return r;
+}
+
+int main() {
+ ios::sync_with_stdio(false);
+ cin.tie(NULL);
+ cout.tie(NULL);
+
+ cin.getline(S, 2000005);
+ cin >> QN;
+ for (long long i = 0; i < QN; i++) {
+ Query qi = {0,0};
+ cin >> qi.first >> qi.second;
+ qs[i] = qi;
+ }
+
+ for (Query& q : qs) {
+ if (q.first == 2) {
+ char* l = lastLeftMatching(S + q.second), *r = lastRightMatching(S + q.second);
+ // cout << "Del " << r-l+1 << endl;
+ long long nl = (S + q.second) - l;
+ while (l <= S + q.second) {
+ mem[l-S] = nl;
+ l++;
+ }
+ nl = r - (S + q.second);
+ while (l <= r) {
+ mem[l-S] = nl;
+ l++;
+ }
+ S[q.second] = '#';
+ }
+ else if (q.first == 1) {
+ if (mem[q.second] > 0) {
+ // cout << "From memory ";
+ cout << mem[q.second] << endl;
+ continue;
+ }
+ // cout << S << endl;
+ char* l = lastLeftMatching(S + q.second), *r = lastRightMatching(S + q.second);
+ long long len = r-l+1;
+ cout << len << endl;
+ while (l <= r) {
+ mem[q.second] = len;
+ l++;
+ }
+ }
+ else {
+ break;
+ }
+ }
+}