【2018/08/22】T1-基础题-string (SDOJ )

   字符串
【描述】 
给定两个字符串 s,t,其中s只包含小写字母以及*,t只包含小写字母。 你可以进行任意多次操作,每次选择 s中的一个*,将它修改为任意多个(可以是 0个)它的前一个字符。问是否能将 s修改为t。 
有多组数据。 
【输入】 
第一行一个整数T表示数据组数。 
每组数据两行,第一行一个字符串 s,第二行一个字符串 t。 
【输出】 
每组数据输出一行,如果能将 s修改为t,输出Yes,否则输出No。 
【输入样例】 

a* 
aaaa 
a* 
ab 
【输出样例】 
Yes 
No 
【子任务】 
对于20%的数据,|s|,|t|<=7。 
对于60%的数据,|s|,|t|<=300。 
对于100%的数据,T<=100,|s|,|t|<=30000。

 

分析

哇。。。。。。好高兴好高兴,第一次A题了,说明这道题确实不难

我就不详细解释了

我们将 s 和 t 划分为若干个极长段,满足每段以字母开头且段内只有一种字母。显然这些段是一一对应的,对于 s 中每一段,如果有 * ,那么它可以变为字母个数>=它的全字母段。 
时间复杂度O(T(|s|+|t|))

 

代码

考场代码

#include
#include
#include
#include
#include
#define in read()
#define N 30005
using namespace std;
inline int read(){
	char ch;int f=1,res=0;
	while((ch=getchar())<'0'||ch>'9')if(ch=='-') f=-1;
	while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+ch-'0';ch=getchar();}
	return f==1?res:-res;
}
struct node{int l,num;char st;}a[N],b[N];
int numa,numb,T;
char s[N];
int main(){
//	freopen("string.in","r",stdin);
//	freopen("string.out","w",stdout);
	T=in;
	for(int tt=1;tt<=T;++tt){
		scanf("%s",s);
		int lens=strlen(s),i,j=0,cnt=0,pre=0;
		s[lens]='!';
		char k;
		while(s[j]=='*') j++;
		k=s[j];
		for(i=j+1;i<=lens;++i){
			if(s[i]=='*') cnt++;
			if(s[i]!=k&&s[i]!='*'){
				a[++numa].l=i-pre;
				a[numa].num=cnt;
				a[numa].st=k;
				cnt=0;k=s[i];pre=i;
			}
		}
		scanf("%s",s);
		lens=strlen(s);pre=0;s[lens]='!';
		k=s[0];
		for(i=1;i<=lens;++i){
			if(s[i]!=k){
				b[++numb].l=i-pre;
				b[numb].st=k;
				k=s[i];pre=i;
			}
		}
		if(numb>numa) {	printf("No\n");numa=0;numb=0;continue;}
		if(numa>numb) {	printf("No\n");numa=0;numb=0;continue;}
		for(i=1;i<=numb;++i){	
			if(i>numa) break;
			if(b[i].st!=a[i].st) break;
			if(b[i].l>a[i].l){
				if(a[i].num==0) break;
				
			}
			if(b[i].l

 

老师给的std,看看这码风就知道读不懂了

#include   
#include   
#include   
#include   
#include   
#include   
using namespace std;   
int T,n,m;   
char s[30010],t[30010];   
 int main(){   
     freopen("string.in","r",stdin);   
     freopen("string.out","w",stdout);   
     int i,j,k,l,u;   
     scanf("%d",&T);   
     while(T--)    {   
        scanf("%s%s",&s,&t);   
        n=strlen(s);   
        m=strlen(t);   
        for(i=j=0;i

 

你可能感兴趣的:(模拟)