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

版权声明:虽然我只是个小蒟蒻但转载也请注明出处哦 https://blog.csdn.net/weixin_42557561/article/details/81942290

   字符串
【描述】 
给定两个字符串 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<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#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<a[i].l){
				if(a[i].num==0) break;
				if(a[i].num<(a[i].l-b[i].l)) break;
			} 
		}
		if(i<=numb||i<numa) printf("No\n");
		else printf("Yes\n");
		numa=0;numb=0;
	}
//	fclose(stdin);fclose(stdout);
	return 0;
}

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

#include<iostream>   
#include<stdio.h>   
#include<stdlib.h>   
#include<string.h>   
#include<math.h>   
#include<algorithm>   
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<n;i=k,j=l) {   
           u=0;   
           for(k=i;k<n && (s[k]=='*' || s[k]==s[i]);k++)   
             if(s[k]=='*')   
               u++;   
           for(l=j;l<m && t[l]==t[j];l++);   
           if(!(s[i]==t[j] && k-i-u<=l-j && (u || k-i==l-j)))   
             break;   
          }   
        if(i<n || j<m)   
          printf("No\n");   
        else   
          printf("Yes\n");   
       }   
     return 0;   
 }   

猜你喜欢

转载自blog.csdn.net/weixin_42557561/article/details/81942290