- 2023tyoi0292 的博客
string
- 2024-4-27 7:49:17 @
string
确实是道签到题,就是有一丢丢毒瘤
思路:先预处理出到第i个位置s有多少个b(倒序处理),然后顺着找有几个a,如果一个位置的两种数量都大于0,就找最大值
AC code :
#include <iostream>
#include <cstdio>
using namespace std;
int cntb[1000005];
string s, a, b;
int main() {
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
cin >> s >> a >> b;
int pos = b.size() - 1, cnt = 0;
for(int i = s.size() - 1; i >= 0; i--) {
if(s[i] == b[pos]) {
pos--;
if(pos == -1) {
cnt++;
pos = b.size() - 1;
}
}
cntb[i] = cnt;
}
pos = 0;
cnt = 0;
int maxn = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] == a[pos]) {
pos++;
if(pos == a.size()) {
cnt++;
pos = 0;
}
}
if(cntb[i + 1] != 0 && cnt != 0) maxn = max(maxn, int(cnt * a.size() + cntb[i + 1] * b.size()));
}
cout << maxn << endl;
return 0;
}