coloriot

HA_60_TS

Aug 2nd, 2025
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <unordered_map>
  5.  
  6. using namespace std;
  7.  
  8. pair<int,int> findAnagramSubstring(const string& T, const string& S) {
  9.     if (S.size() > T.size()) return {-1, -1};
  10.  
  11.     vector<int> need(256, 0), window(256, 0);
  12.     int distinct = 0; // число уникальных символов в S
  13.  
  14.     for (char c : S) {
  15.         if (need[(unsigned char)c] == 0) distinct++;
  16.         need[(unsigned char)c]++;
  17.     }
  18.  
  19.     int matches = 0;
  20.     auto add = [&](char c) {
  21.         unsigned char uc = (unsigned char)c;
  22.         window[uc]++;
  23.         if (window[uc] == need[uc]) {
  24.             matches++;
  25.         } else if (window[uc] == need[uc] + 1) {
  26.             // раньше было совпадение, теперь перестало
  27.             matches--;
  28.         }
  29.     };
  30.  
  31.     auto remove = [&](char c) {
  32.         unsigned char uc = (unsigned char)c;
  33.         window[uc]--;
  34.         if (window[uc] == need[uc]) {
  35.             matches++;
  36.         } else if (window[uc] + 1 == need[uc]) {
  37.             // раньше не совпадало, теперь
  38.             // перестало быть недостатком
  39.             matches--;
  40.         }
  41.     };
  42.  
  43.     // Инициализация первого окна
  44.     for (size_t i = 0; i < S.size(); ++i) {
  45.         add(T[i]);
  46.     }
  47.     if (matches == distinct) {
  48.         return {0, (int)S.size() - 1};
  49.     }
  50.  
  51.     for (size_t i = S.size(); i < T.size(); ++i) {
  52.         add(T[i]);
  53.         remove(T[i - S.size()]);
  54.         if (matches == distinct) {
  55.             return {(int)(i - S.size() + 1), (int)i};
  56.         }
  57.     }
  58.  
  59.     return {-1, -1}; // не найдено
  60. }
  61.  
  62. int main() {
  63.     string T = "abacabatext";
  64.     string S = "aabct";
  65.     auto [l, r] = findAnagramSubstring(T, S);
  66.     if (l != -1) {
  67.         cout << "Found subarray: " << T.substr(l, r - l + 1) << " in indexes [" << l << ", " << r << "]\n";
  68.     } else {
  69.         cout << "There is now subarray\n";
  70.     }
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment