题意
给定 s s s 和 t t t 两个字符串,求把字符串 t t t 一分为二,存在子序列恰为字符串 s s s 的合法划分的方案数。
分析
数据范围较大,直接暴力过不了。
想要正确做出来,分为几个步骤:
-
先从字符串 t t t 的开头找 s s s,记录位置,记作 x x x。
-
再从字符串 t t t 的结尾找 s s s,记录位置,记作 y y y。
-
最后要知道:在 x x x 到 y y y 这个区间都可以分割, y − x y-x y−x 就是合法划分的方案数,如果差为负数,就输出 0 0 0。
Code
#include <cstdio>
#include <iostream>
using namespace std;
string s, t;
int x, y, ans, cnt, res;
int max (int, int);
int main() {
cin >> s >> t;
// 计数器 res 初始化
res = s.size() - 1;
// 从 T 的开头找 S
for (int i = 0; i < t.size(); i++) {
// 判断是否相等
if (t[i] == s[cnt]) {
cnt++;
// 记下位置
x = i;
}
// 如果找完了
if (cnt == s.size())
// 跳出循环,结束
break;
}
// 从 T 的结尾找 S
for (int i = t.size() - 1; i >= 0; i--) {
// 判断是否相等
if (t[i] == s[res]) {
res--;
// 记下位置
y = i;
}
// 如果找完了
if (res == -1)
// 跳出循环,结束
break;
}
// x 到 y 的位置都可以分割,如果差是负数,输出 0
ans = max (y - x, 0);
printf ("%d", ans);
return 0;
}
int max (int x, int y) {
return (x > y) ? x : y;
}
完结撒花。
469

被折叠的 条评论
为什么被折叠?



