[2018.10.15 T2] 字符串

16 篇文章 0 订阅

暂无连接

字符串

【题目描述】

小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,t7
对于 60 % 60\% 60%的数据, ∣ s ∣ , ∣ t ∣ ≤ 300 |s|,|t|≤300 s,t300
对于 100 % 100\% 100%的数据, T ≤ 100 , ∣ s ∣ , ∣ t ∣ ≤ 30000 T≤100,|s|,|t|≤30000 T100s,t30000

题解

特殊情况大概长成这样 a ∗ a a a ∗ ∗ ∗ a a*aaa***a aaaaa,这种情况跟 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();}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值