您的位置:首页 > 其它

hdu5414

2015-08-21 19:58 134 查看
这道题在原先的想法上经过一定的优化就可以过了,但是经过优化后,一直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
;
char t
;
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
;
char ta
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: