这道题在原先的想法上经过一定的优化就可以过了,但是经过优化后,一直wr,经过一个多小时的抗争,终于明白sbn只要>=tbn就可以了,不一定要严格等于。(sbn,tbn的含义可在代码中找到)
参考来源:http://blog.csdn.net/wangcong9614/article/details/47809239
2015.8.29:
又再推了一遍,其实不难,关键是可能已经做过一遍了吧,希望下次可以装装的说:“这道题呀?虽然我没做过,但是简单,看一眼就成。”容我做会儿白日梦。
原先的代码(超时):
#include
#include
#include
using namespace std;
#define N 100010
#define M 26
#define INF 0x3f3f3f3f
char s[N];
char t[N];
int loca[M];
int aloca[M];
int main(){
int cas;
int win;
scanf("%d\n",&cas);
while(cas--){
scanf("%s",s);
scanf("%s",t);
memset(loca,-1,sizeof(loca));
for(int i=0;t[i]!='\0';i++){
int tempch=t[i]-'a';
if(loca[tempch]==-1){
loca[tempch]=i;
}
}
for(int i=0;iloca[temp]){
win=0;
break;
}
}
}
}
if(win==1){
if(t[j]=='\0'&&s[i]!='\0'){
win=0;
}
else if(t[j]!='\0'&&s[i]=='\0'){
for(;t[j]=='\0'||t[j]!=s[i-1];j++){
int tempch=s[i-1]-'a';
if(aloca[tempch]>loca[tempch]){
win=0;
break;
}
}
}
}
if(win==0){
printf("No\n");
}
else{
printf("Yes\n");
}
}
return 0;
}
过了的代码:
#include
#include
#include
using namespace std;
#define N 1000100
char sa[N];
char ta[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",sa);
scanf("%s",ta);
int i,j;
for(i=0,j=0;sa[i]!='\0'&&ta[j]!='\0';j++){
if(sa[i]==ta[j]){
i++;
}
}
if(sa[i]!='\0'){
printf("No\n");
}
else{
char sb=sa[0];
char tb=ta[0];
int sbn=1;
int tbn=1;
for(int i=1;sa[i]!='\0';i++){
if(sa[i]==sa[i-1]){
sbn++;
}
else{
break;
}
}
for(int i=1;ta[i]!='\0';i++){
if(ta[i]==ta[i-1]){
tbn++;
}
else{
break;
}
}
if(sb==tb&&sbn>=tbn){
//printf("%d %d\n",sbn,tbn);
printf("Yes\n");
}
else{
printf("No\n");
}
/*int flag=0;
int j;
for(j=1;ta[j]!='\0';j++)
{
if(ta[j]==ta[j-1])
continue;
else
break;
}
for(int i=0;i