暂无连接
字符串
【题目描述】
小C学会了 S A SA SA和 S A M SAM SAM之后,非常激动。
他看见了两个字符串 s , t s,t s,t,其中 s s s只包含小写字母以及 ∗ * ∗, t t t只包含小写字母。
小C可以进行任意多次操作,每次选择 s s s中的一个 ∗ * ∗,将它修改为任意多个(可以是 0 0 0个)它的前一个字符。他想知道是否能将 s s s修改为 t t t。
请你帮小C求解这道简单字符串题。
有多组数据。
【输入】
第一行一个整数 T T T表示数据组数。
每组数据两行,第一行一个字符串 s s s,第二行一个字符串 t t t。
【输出】
每组数据输出一行,如果能将 s s s修改为 t t t,输出 Y e s Yes Yes,否则输出 N o No No。
【输入样例】
2
a*
aaaa
a*
ab
【输出样例】
Yes
No
【提示】
【数据规模及约定】
对于
20
%
20\%
20%的数据,
∣
s
∣
,
∣
t
∣
≤
7
|s|,|t|≤7
∣s∣,∣t∣≤7。
对于
60
%
60\%
60%的数据,
∣
s
∣
,
∣
t
∣
≤
300
|s|,|t|≤300
∣s∣,∣t∣≤300。
对于
100
%
100\%
100%的数据,
T
≤
100
,
∣
s
∣
,
∣
t
∣
≤
30000
T≤100,|s|,|t|≤30000
T≤100,∣s∣,∣t∣≤30000。
题解
特殊情况大概长成这样 a ∗ a a a ∗ ∗ ∗ a a*aaa***a a∗aaa∗∗∗a,这种情况跟 a a a a a ∗ aaaaa* aaaaa∗等价,我们读入 s s s串的时候先把所有特殊情况处理掉,最后写个无脑模拟即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int M=3e4+5;
char ch[M],s[M],t[M];
int l1,l2,p1,p2,tot,T,flag;
void reset(){memset(s,tot=0,sizeof(s));}
void in(){scanf("%s%s",ch+1,t+1);}
void ac()
{
l1=strlen(ch+1),l2=strlen(t+1);
for(p1=1,p2,flag;p1<=l1;p1=p2+1)
{
p2=p1;flag=0;
for(;(ch[p2]==ch[p1]||ch[p2]=='*')&&p2<=l1;++p2);
p2-=1;
for(int i=p1;i<=p2;++i)ch[i]!='*'?s[++tot]=ch[p1]:flag=1;
if(flag)s[++tot]='*';
}
l1=tot;
for(p1=1,p2=1;p1<=l1;++p1)
{
if(s[p1]==t[p2]){++p2;continue;}
if(s[p1]!='*'){puts("No");return;}
for(;s[p1-1]==t[p2];++p2);
}
(p2>l2&&p1>l1)?puts("Yes"):puts("No");
}
int main(){for(scanf("%d",&T);T--;)reset(),in(),ac();}