2020.12.02 晚间训练
Day -2
总得分:100/300
一、string
【题目描述】
给定两个字符串\(s\)、\(t\),其中s只包含小写字母以及\(*\),\(t\)只包含小写字母。
你可以进行任意多次操作,每次选择\(s\) 中的一个\(*\),将它修改为任意多个(可以是\(0\)个)它的前一个字符。问是否能将\(s\) 修改为\(t\)。
有多组数据。
【输入数据】
第一行一个整数\(T\) 表示数据组数。
每组数据两行,第一行一个字符串s,第二行一个字符串t。
【输出数据】
每组数据输出一行,如果能将s修改为t,输出Yes,否则输出No。
【样例输入】
2
a*
aaaa
a*
ab
【样例输出】
Yes
No
【数据范围】
对于\(20%\) 的数据,\(|s|\),\(|t|<=7\)。
对于\(60%\) 的数据,\(|s|\),\(|t|<=300\)。
对于\(100%\) 的数据,\(T<=100\),\(|s|\),\(|t|<=30000\)。
Solution
没什么好说的,模拟。
把两个字符串连续相同的字母给合并为一个的形式,即建立结构体的桶用于存放。
对于出现了\(*\)的情况,在它前面的一个字母上打标,表示前面一个字母可以复制无限个。
注意:
很有可能出现以下情况:
a**ab
aab
因为两个\(a\) 之间被\(*\) 断开,导致错开了\(2\) 个桶
所以遇到这种情况要合并掉
code:
#include <bits/stdc++.h>
#define REP(i, x, y) for(register int i = x; i < y; i++)
#define rep(i, x, y) for(register int i = x; i <= y; i++)
#define PER(i, x, y) for(register int i = x; i > y; i--)
#define per(i, x, y) for(register int i = x; i >= y; i--)
using namespace std;
const int N = 30005;
struct node{
char ch;
int sum;
}t1[N], t2[N];
string s1, s2;
int T, len1, len2, tag[N];
int main()
{
freopen("string.in", "r", stdin);
freopen("string.out", "w", stdout);
scanf("%d", &T);
while(T--)
{
int cnt1 = 0, cnt2 = 0;
int temp = 1;
memset(t1, 0, sizeof t1);
memset(t2, 0, sizeof t2);
memset(tag, 0, sizeof tag);
cin >> s1 >> s2;
len1 = s1.length();
len2 = s2.length();
rep(i, 1, len1)
{
t1[i].sum = 0;
}
rep(i, 1, len2)
{
t2[i].sum = 0;
}
rep(i, 0, len1 - 1)
{
if(s1[i] != '*')
{
if(t1[cnt1].ch != s1[i])
{
cnt1++;
}
t1[cnt1].ch = s1[i];
temp = t1[cnt1].sum + 1;
while(s1[i + 1] == s1[i])
{
temp++;
i++;
}
t1[cnt1].sum = temp;
temp = 1;
}
else
{
tag[cnt1] = 1;
}
}
temp = 1;
rep(i, 0, len2 - 1)
{
if(s2[i] != '*')
{
t2[++cnt2].ch = s2[i];
while(s2[i + 1] == s2[i])
{
temp++;
i++;
}
t2[cnt2].sum = temp;
temp = 1;
}
}
if(cnt1 != cnt2)
{
cout << "No" << endl;
continue;
}
int f = 0;
rep(i, 1, cnt1)
{
if(t1[i].ch != t2[i].ch)
{
cout << "No" << endl;
f = 1;
break;
}
else if((t1[i].sum > t2[i].sum) || (t1[i].sum < t2[i].sum && tag[i] == 0))
{
cout << "No" << endl;
f = 1;
break;
}
}
if(!f)
{
cout <<"Yes" << endl;
}
}
return 0;
}