字符串

题目大意:他看见了两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母。可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字符。他想知道是否能将 s 修改为 t。请即将入选 IOI 国家队的你帮 infinite32768 求解这道简单字符串题

考场上没看出来是个模拟,把简单的问题复杂化了

其实就是无脑匹配,但是有个坑点:

1
2
a****a
aa

必须要记录能跳多少个,如果发现s串跳的比t串长就No了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#define int long long
using namespace std;

const int N = 3e4 + 66;

char a[N], b[N];

signed main()
{
int T = read();

while (T --)
{
int pd = 0;
scanf ("%s", a + 1), scanf ("%s", b + 1);
int n = strlen(a + 1), m = strlen(b + 1);
int t = 1, k = 1;
while (t <= n && k <= m)
{
if (a[t] != b[k])
{
puts("No");
pd = 1;
break;
}
if (a[t + 1] == '*')
{
char ch = a[t];
int num = 0, num1 = 0;
while (a[t + 1] == '*' || a[t + 1] == ch)
{
if (a[t + 1] == ch) ++ num;
++ t;
}
while (k < m && b[k + 1] == ch)
{
++ num1;
++ k;
}
if (num > num1)
{
pd = 1;
puts("No");
break;
}
}
++ t, ++ k;
}

if (pd != 1)
{
if (t == n + 1 && k == m + 1) puts("Yes");
else puts("No");
}
}

return 0;
}