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;
}