string minWindow(string s, string t) {
     if(s.length() < t.length()) return "";
     
     const int ASCII_SIZE = 256;
     vector<int> appeared_count(ASCII_SIZE, 0);
     vector<int> expected_count(ASCII_SIZE, 0);
     for(auto c:t) expected_count[c]++;
     
     int min_width=INT_MAX, min_start=0, win_start=0, appeared=0;
     for(size_t win_end=0; win_end<s.length(); win_end++) {
         char c = s[win_end];
         if(expected_count[c]>0) {
             appeared_count[c]++;
             if(appeared_count[c] <= expected_count[c]) appeared++;
         }
         
         if(appeared == t.length()) {
             while(appeared_count[s[win_start]]>expected_count[s[win_start]] || expected_count[s[win_start]]==0) {
                 appeared_count[s[win_start]]--;
                 win_start++;
             }
             
             if(min_width > (win_end-win_start+1)) {
                 min_width = win_end-win_start+1;
                 min_start = win_start;
             }
         }
     }
     
     return min_width == INT_MAX ? "" : s.substr(min_start, min_width);
 }
    inline std::size_t operator+=(const std::size_t increment)
    {
      m_count += increment;

      on_progress(count(), expected_count());

      return m_expected_count;
    }
 inline bool complete() const
 {
   return count() >= expected_count();
 }