ProgMe

Untitled

Dec 23rd, 2023
1,048
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #include <utility>
  4.  
  5. using namespace std;
  6.  
  7. class ASCIIString {
  8. public:
  9.     ASCIIString();
  10.  
  11.     ASCIIString(basic_string<char> other);
  12.  
  13.     operator string();
  14.  
  15.     ASCIIString& operator += (const ASCIIString& other);
  16.  
  17.     void reverse(size_t lpos, size_t rpos);
  18.  
  19.     ASCIIString lastGreaterSecuence(size_t count);
  20.  
  21.     ASCIIString lastLessSecuence(size_t count);
  22.  
  23.     ASCIIString firstLessSecuence(size_t count);
  24.  
  25.     void capitaliseVowels();
  26.  
  27.     void capitaliseConsonants();
  28.  
  29.     void vowelsIntoHex();
  30.  
  31.     void romanDigits();
  32.  
  33.     void reverse();
  34.  
  35.     void reverseInWords();
  36.  
  37.     size_t vowels();
  38.  
  39.     size_t consonants();
  40.  
  41.     char minLetter();
  42.  
  43.     char maxLetter();
  44.  
  45.     void changeRegister();
  46.  
  47.     bool isPalindrome();
  48.  
  49.     size_t digits();
  50.  
  51.     size_t letters();
  52.  
  53.     map<char, int> dictOfElements();
  54.  
  55.     map<char, int> dictOfDigits();
  56.  
  57.     int sumOfDigits();
  58.  
  59.     size_t numberOfPunctuations();
  60.  
  61.     size_t posSubstring(ASCIIString sub);
  62.  
  63.     vector<size_t> positionsSubstring(ASCIIString sub);
  64.  
  65.     size_t numberOfWords();
  66.  
  67.     size_t numberOfNumbers();
  68.  
  69.     bool isRightBracketSecuence();
  70.  
  71.     ASCIIString palindromeString();
  72.  
  73.     ASCIIString capitalWords();
  74.  
  75.     ASCIIString digitsString();
  76.  
  77.     pair<ASCIIString, ASCIIString> notInThese(const ASCIIString &first, const ASCIIString &second);
  78.  
  79.     ASCIIString intersectionString(const ASCIIString &first, const ASCIIString &second);
  80.  
  81.     ASCIIString unionString(const ASCIIString &first, const ASCIIString &second);
  82.  
  83. private:
  84.     string s;
  85. };
  86.  
  87. ASCIIString::ASCIIString() {
  88.     s = "";
  89. }
  90.  
  91. ASCIIString::ASCIIString(basic_string<char> other) {
  92.     s = std::move(other);
  93. }
  94.  
  95. ASCIIString::operator string() {
  96.     return s;
  97. }
  98.  
  99. ASCIIString &ASCIIString::operator+=(const ASCIIString& other) {
  100.     s += other.s;
  101.     return *this;
  102. }
  103.  
  104. void ASCIIString::reverse(size_t lpos, size_t rpos) {
  105.     while (lpos < rpos) {
  106.         swap(s[lpos++], s[rpos--]);
  107.     }
  108. }
  109.  
  110. ASCIIString ASCIIString::lastGreaterSecuence(size_t count) {
  111.     if (count > s.size()) {
  112.         return string();
  113.     }
  114.  
  115.     int cnt = 0;
  116.     for (int j = s.size() - 2; j >= s.size() - count; --j) {
  117.         if (s[j] <= s[j + 1]) {
  118.             cnt++;
  119.         }
  120.     }
  121.  
  122.     for (int i = s.size() - count; i >= 0; --i) {
  123.         if (cnt == 0) {
  124.             return s.substr(i, count);
  125.         }
  126.         if (i) {
  127.             cnt += s[i - 1] <= s[i];
  128.             cnt -= s[i + count - 2] <= s[i + count - 1];
  129.         }
  130.     }
  131.     return string();
  132. }
  133.  
  134. ASCIIString ASCIIString::lastLessSecuence(size_t count) {
  135.     if (count > s.size()) {
  136.         return string();
  137.     }
  138.  
  139.     int cnt = 0;
  140.     for (int j = s.size() - 2; j >= s.size() - count; --j) {
  141.         if (s[j] >= s[j + 1]) {
  142.             cnt++;
  143.         }
  144.     }
  145.  
  146.     for (int i = s.size() - count; i >= 0; --i) {
  147.         if (cnt == 0) {
  148.             return s.substr(i, count);
  149.         }
  150.         if (i) {
  151.             cnt += s[i - 1] >= s[i];
  152.             cnt -= s[i + count - 2] >= s[i + count - 1];
  153.         }
  154.     }
  155.     return string();
  156. }
  157.  
  158. ASCIIString ASCIIString::firstLessSecuence(size_t count) {
  159.     if (count > s.size()) {
  160.         return string();
  161.     }
  162.  
  163.     int cnt = 0;
  164.     for (int j = 0; j + 1 < count; ++j) {
  165.         if (s[j] >= s[j + 1]) {
  166.             cnt++;
  167.         }
  168.     }
  169.  
  170.     for (int i = 0; i + count - 1 < s.size(); ++i) {
  171.         if (cnt == 0) {
  172.             return s.substr(i, count);
  173.         }
  174.         if (i + count < s.size()) {
  175.             cnt += s[i + count] >= s[i + count - 1];
  176.             cnt -= s[i] >= s[i - 1];
  177.         }
  178.     }
  179.     return string();
  180. }
  181.  
  182. void ASCIIString::capitaliseVowels() {
  183.     for (auto &i : s) {
  184.         if (isalpha(i)) {
  185.             i = static_cast<char>(toupper(i));
  186.         }
  187.     }
  188. }
  189.  
  190. void ASCIIString::capitaliseConsonants() {
  191.     for (auto &i : s) {
  192.         if (isalpha(i)) {
  193.             i = static_cast<char>(tolower(i));
  194.         }
  195.     }
  196. }
  197.  
  198. string hex(char c) {
  199.     std::stringstream sstream;
  200.     sstream << std::hex << static_cast<int>(c);
  201.  
  202.     return sstream.str();
  203. }
  204.  
  205. void ASCIIString::vowelsIntoHex() {
  206.     string upd;
  207.  
  208.     for (auto &i : s) {
  209.         char cur = tolower(i);
  210.         set<int> vowels = {'a', 'e', 'y', 'i', 'o', 'u'};
  211.         if (vowels.find(cur) != vowels.end()) {
  212.             upd += hex(i);
  213.         } else {
  214.             upd += i;
  215.         }
  216.     }
  217.  
  218.     s = std::move(upd);
  219. }
  220.  
  221. string roman(char c) {
  222.     int cur = c - '0';
  223.  
  224.     switch (cur) {
  225.         case 1:
  226.             return "1";
  227.         case 2:
  228.             return "11";
  229.         case 3:
  230.             return "111";
  231.         case 4:
  232.             return "15";
  233.         case 5:
  234.             return "5";
  235.         case 6:
  236.             return "51";
  237.         case 7:
  238.             return "511";
  239.         case 8:
  240.             return "5111";
  241.         case 9:
  242.             return "110";
  243.     }
  244. }
  245.  
  246. void ASCIIString::romanDigits() {
  247.     string upd;
  248.  
  249.     for (auto &i : s) {
  250.         if (isdigit(i) && i != '0') {
  251.             upd += roman(i);
  252.         } else {
  253.             upd += i;
  254.         }
  255.     }
  256.  
  257.     s = std::move(upd);
  258. }
  259.  
  260. void ASCIIString::reverse() {
  261.     reverse(0, s.size() - 1);
  262. }
  263.  
  264. void ASCIIString::reverseInWords() {
  265.     int lb = 0, rb = 0;
  266.  
  267.     while (lb < s.size()) {
  268.         while (rb < s.size() && isalpha(s[rb])) {
  269.             ++rb;
  270.         }
  271.         reverse(lb, rb - 1);
  272.         lb = rb;
  273.     }
  274. }
  275.  
  276. size_t ASCIIString::vowels() {
  277.     set<int> vowels = {'a', 'e', 'i', 'o', 'u', 'y'};
  278.  
  279.     int cnt = 0;
  280.     for (auto i : s) {
  281.         i = tolower(i);
  282.         if (vowels.count(i)) {
  283.             ++cnt;
  284.         }
  285.     }
  286.     return cnt;
  287. }
  288.  
  289. size_t ASCIIString::consonants() {
  290.     set<int> consonants = {'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Z'};
  291.  
  292.     int cnt = 0;
  293.     for (auto i : s) {
  294.         i = toupper(i);
  295.         if (consonants.count(i)) {
  296.             ++cnt;
  297.         }
  298.     }
  299.     return cnt;
  300. }
  301.  
  302. char ASCIIString::minLetter() {
  303.     char ans = numeric_limits<char>::max();
  304.     for (auto i : s) {
  305.         ans = min(ans, i);
  306.     }
  307.     return ans;
  308. }
  309.  
  310. char ASCIIString::maxLetter() {
  311.     char ans = 0;
  312.     for (auto i : s) {
  313.         ans = max(ans, i);
  314.     }
  315.     return ans;
  316. }
  317.  
  318. void ASCIIString::changeRegister() {
  319.     for (auto &i : s) {
  320.         if (islower(i)) {
  321.             i = toupper(i);
  322.         } else if (isupper(i)) {
  323.             i = tolower(i);
  324.         }
  325.     }
  326. }
  327.  
  328. bool ASCIIString::isPalindrome() {
  329.     for (int i = 0; i < s.size(); ++i) {
  330.         if (s[i] != s[s.size() - i - 1]) {
  331.             return false;
  332.         }
  333.     }
  334.     return true;
  335. }
  336.  
  337. size_t ASCIIString::digits() {
  338.     int cnt = 0;
  339.     for (auto i : s) {
  340.         if (isdigit(i)) {
  341.             ++cnt;
  342.         }
  343.     }
  344.     return cnt;
  345. }
  346.  
  347. size_t ASCIIString::letters() {
  348.     int cnt = 0;
  349.     for (auto i : s) {
  350.         if (isalpha(i)) {
  351.             ++cnt;
  352.         }
  353.     }
  354.     return cnt;
  355. }
  356.  
  357. map<char, int> ASCIIString::dictOfElements() {
  358.     map<char, int> cnt;
  359.  
  360.     for (auto i : s) {
  361.         ++cnt[i];
  362.     }
  363.  
  364.     return cnt;
  365. }
  366.  
  367. map<char, int> ASCIIString::dictOfDigits() {
  368.     map<char, int> cnt;
  369.  
  370.     for (auto i : s) {
  371.         if (isdigit(i)) {
  372.             ++cnt[i];
  373.         }
  374.     }
  375.  
  376.     return cnt;
  377. }
  378.  
  379. int ASCIIString::sumOfDigits() {
  380.     int sum = 0;
  381.  
  382.     for (auto i : s) {
  383.         if (isdigit(i)) {
  384.             sum += i;
  385.         }
  386.     }
  387.  
  388.     return sum;
  389. }
  390.  
  391. size_t ASCIIString::numberOfPunctuations() {
  392.     size_t cnt = 0;
  393.  
  394.     for (auto i : s) {
  395.         if (i == ',' || i == '.' || i == '?' || i == '!') {
  396.             ++cnt;
  397.         }
  398.     }
  399.  
  400.     return cnt;
  401. }
  402.  
  403. vector<size_t> ASCIIString::positionsSubstring(ASCIIString sub) {
  404.     string cur = sub.s + '#' + s;
  405.  
  406.     vector<int> z (cur.size());
  407.     for (int i = 1, l = 0, r = 0; i < cur.size(); ++i) {
  408.         if (i <= r) {
  409.             z[i] = min(r - i + 1, z[i - l]);
  410.         }
  411.         while (i+z[i] < cur.size() && cur[z[i]] == cur[i+z[i]]) {
  412.             ++z[i];
  413.         }
  414.         if (i+z[i]-1 > r) {
  415.             l = i, r = i + z[i] - 1;
  416.         }
  417.     }
  418.  
  419.     vector<size_t> ans;
  420.     for (int i = 0; i + sub.s.size() + 1 < cur.size(); ++i) {
  421.         if (z[i + sub.s.size() + 1] == sub.s.size()) {
  422.             ans.push_back(i);
  423.         }
  424.     }
  425.     return ans;
  426. }
  427.  
  428. size_t ASCIIString::posSubstring(ASCIIString sub) {
  429.     auto ans = positionsSubstring(sub);
  430.     return ans.empty() ? -1 : ans[0];
  431. }
  432.  
  433. size_t ASCIIString::numberOfWords() {
  434.     int lb = 0, rb = 0, cnt = 0;
  435.  
  436.     while (lb < s.size()) {
  437.         while (rb < s.size() && isalpha(s[rb])) {
  438.             ++rb;
  439.         }
  440.         lb = rb;
  441.         ++cnt;
  442.     }
  443.     return cnt;
  444. }
  445.  
  446. bool ASCIIString::isRightBracketSecuence() {
  447.     int bln = 0;
  448.  
  449.     for (auto i : s) {
  450.         if (i == '(') {
  451.             ++bln;
  452.         } else if (i == ')') {
  453.             --bln;
  454.         }
  455.         if (bln < 0) {
  456.             return false;
  457.         }
  458.     }
  459.     return bln == 0;
  460. }
  461.  
  462. size_t ASCIIString::numberOfNumbers() {
  463.     int lb = 0, rb = 0, cnt = 0;
  464.  
  465.     while (lb < s.size()) {
  466.         while (rb < s.size() && isdigit(s[rb])) {
  467.             ++rb;
  468.         }
  469.         lb = rb;
  470.         ++cnt;
  471.     }
  472.     return cnt;
  473. }
  474.  
  475. ASCIIString ASCIIString::palindromeString() {
  476.     ASCIIString ans;
  477.  
  478.     int lb = 0, rb = 0, cnt = 0;
  479.  
  480.     while (lb < s.size()) {
  481.         while (rb < s.size() && isalpha(s[rb])) {
  482.             ++rb;
  483.         }
  484.         if (ASCIIString(s.substr(lb, rb - 1)).isPalindrome()) {
  485.             ans += s.substr(lb, rb - 1);
  486.         }
  487.  
  488.         lb = rb;
  489.         ++cnt;
  490.     }
  491.  
  492.     return ans;
  493. }
  494.  
  495. ASCIIString ASCIIString::capitalWords() {
  496.     ASCIIString ans;
  497.  
  498.     int lb = 0, rb = 0, cnt = 0;
  499.  
  500.     while (lb < s.size()) {
  501.         while (rb < s.size() && isalpha(s[rb])) {
  502.             ++rb;
  503.         }
  504.         if (lb < rb && isupper(s[lb])) {
  505.             ans += s.substr(lb, rb - 1);
  506.         }
  507.  
  508.         lb = rb;
  509.         ++cnt;
  510.     }
  511.  
  512.     return ans;
  513. }
  514.  
  515. ASCIIString ASCIIString::digitsString() {
  516.     ASCIIString ans;
  517.  
  518.     int lb = 0, rb = 0, cnt = 0;
  519.  
  520.     while (lb < s.size()) {
  521.         while (rb < s.size() && isdigit(s[rb])) {
  522.             ++rb;
  523.         }
  524.         if (lb < rb) {
  525.             ans += s.substr(lb, rb - 1);
  526.         }
  527.  
  528.         lb = rb;
  529.         ++cnt;
  530.     }
  531.  
  532.     return ans;
  533. }
  534.  
  535. pair<ASCIIString, ASCIIString> ASCIIString::notInThese(const ASCIIString &first, const ASCIIString &second) {
  536.     ASCIIString f_ans, s_ans;
  537.  
  538.     for (char c = 0; c <= numeric_limits<char>::max(); ++c) {
  539.         if (!first.s.contains(c)) {
  540.             f_ans += string(&"" [c]);
  541.         }
  542.     }
  543.  
  544.     for (char c = 0; c <= numeric_limits<char>::max(); ++c) {
  545.         if (!second.s.contains(c)) {
  546.             s_ans += string(&"" [c]);
  547.         }
  548.     }
  549.  
  550.     return {f_ans, s_ans};
  551. }
  552.  
  553. ASCIIString ASCIIString::intersectionString(const ASCIIString &first, const ASCIIString &second) {
  554.     map<char, int> cl, cr;
  555.  
  556.     for (auto i : first.s) {
  557.         ++cl[i];
  558.     }
  559.     for (auto i : second.s) {
  560.         ++cr[i];
  561.     }
  562.  
  563.     ASCIIString ans;
  564.     for (auto i : cl) {
  565.         if (cr[i.first]) {
  566.             ans += string(&"" [ i.first]);
  567.         }
  568.     }
  569.     return ans;
  570. }
  571.  
  572. ASCIIString ASCIIString::unionString(const ASCIIString &first, const ASCIIString &second) {
  573.     map<char, int> cl, cr;
  574.  
  575.     for (auto i : first.s) {
  576.         ++cl[i];
  577.     }
  578.     for (auto i : second.s) {
  579.         ++cr[i];
  580.     }
  581.  
  582.     ASCIIString ans;
  583.     for (auto i : cl) {
  584.         ans += string(&"" [ i.first]);
  585.     }
  586.     for (auto i : cr) {
  587.         if (!cl[i.first]) {
  588.             ans += string(&""[i.first]);
  589.         }
  590.     }
  591.     return ans;
  592. }
  593.  
  594. int32_t main() {
  595.     ASCIIString lol ("dc");
  596. }
  597.  
Advertisement
Add Comment
Please, Sign In to add comment