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