[codeforces 1303C] Perfect Keyboard 写好一一映射f[x]=y,g[y]=x

[codeforces 1303C] Perfect Keyboard  写好一一映射f[x]=y,g[y]=x

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1303/problem/C

Problem Lang Verdict Time Memory
C - Perfect Keyboard GNU C++11 Accepted 31 ms 0 KB

写好一一映射f[x]=y,g[y]=x

开始时有些蒙,想了不切合编写的算法,之后,主动从计算机处理角度思维,对输入自左往右,一个字母一个字母的处理,思路自然而来。

铺开一个空间,将输入中的第一个字母加入开设空间的中间位置,

第二个字母,加在第一个字母的右边,

第三个字母,看是否与前面字母雷同,若是,就不处理......感觉说了些废话,还是用例子来模拟吧,这样看得清楚。

样例YES数据模拟如下

1
codedoca

YES
edocabfghijklmnpqrstuvwxyz

模拟如下
加入c          c
加入o          co
加入d          cod
加入e          code
加入d          code
加入o          code
加入c          code
加入a         acode

acodebfghijklmnpqrstuvwxyz

样例NO数据模拟如下

1
abcda

NO

数据模拟如下

加入a       a
加入b       ab
加入b       abc
加入d       abcd
加入a    按题意,发现加不进

输出
NO

会想与会编,还是有一定差距的,放在非比赛时期,这样的问题,因该很快就编好,无奈是比赛,种种状况都容易出。

程序编好后,对着样例,突然发现一组数据对不上,怎么回事,提交AC.

事后回看,样例中的输入行与输出行看错位了,比赛时,太容易出状况。

#include <stdio.h>
#include <string.h>
char s[210];
int pos[30],b,a[100],d;
int min(int a,int b){
	return a<b?a:b;
}
int max(int a,int b){
	return a>b?a:b;
}
int main(){
	int t,l,r,len,flag,i;
	scanf("%d",&t);
	while(t--){
		scanf("%s",s+1);
		memset(a,0,sizeof(a)),memset(pos,0,sizeof(pos));
		l=r=50;
		pos[s[1]-'a']=50,a[50]=s[1],l=r=50;
		len=strlen(s+1);
		flag=0;
		for(i=2;i<=len;i++){
			b=pos[s[i-1]-'a'],d=pos[s[i]-'a'];
			if(d){
				if(d==b+1||b==d+1)continue;
				else{
					flag=1;
					break;
				}
			}
			if(a[b+1]==0)a[b+1]=s[i],pos[s[i]-'a']=b+1,r=max(r,b+1);
			else if(a[b-1]==0)a[b-1]=s[i],pos[s[i]-'a']=b-1,l=min(l,b-1);
			else{
				flag=1;
				break;
			}
		}
		if(flag)printf("NO\n");
		else{
			printf("YES\n");
			for(i=l;i<=r;i++)printf("%c",a[i]);
			for(i=0;i<26;i++)
				if(pos[i]==0)
					printf("%c",'a'+i);
			printf("\n");
		}
	}
	return 0;
}
发布了537 篇原创文章 · 获赞 529 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104291166