acwing -- 3358. 放养但没有完全放养
利用计数的思想,把每个字母分配到26个桶中,下标从小到大排序,利用upper_bound即可判断
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { string s1, s2; cin >> s1 >> s2; vector<vector<int>> cnt(26, vector<int>()); for(int i = 0; i < s1.size(); i ++ ) { cnt[s1[i] - 'a'].push_back(i); } int res = 1; int last = -1; for(auto c : s2) { auto it = upper_bound(cnt[c - 'a'].begin(), cnt[c - 'a'].end(), last); if(it != cnt[c - 'a'].end()) { last = *it; } else { res ++ ; last = -1; it = upper_bound(cnt[c - 'a'].begin(), cnt[c - 'a'].end(), last); if(it != cnt[c - 'a'].end()) { last = *it; } } } cout << res << endl; return 0; }