CF-Round 82-div2-C题

CF-Round 82-div2-C题

C. Perfect Keyboard

正如其所名,完美的键盘~这是一道字符串模拟题啦

传送门

题目大概意思就是让你构造一个键盘(这算不算一个构造呢~)要求是主人公太懒啦,不想移动手指,要求构造的键盘满足这样的条件:输入字符串,主人公要敲这些字符串,所以这些字符串相邻的要在键盘上相邻。问存不存在这样的键盘,如果存在,就输出构造的键盘,否则输出NO

首先一看到这个题目无非就是模拟一下,然后把答案记录在ans(string类型)里面,很好,为了简便,我们首先直接把第一个字符串输入到答案里面,然后选取一个pos为0,这个pos是索引当前字母的位置,
如果当前字母没有出现过,并且pos还是0,我们就把这个字母加到前面去,如果不等于0,如果pos为ans里面的最后一个索引字符,我们就把它加到后面去,其余的情况我们就可以输出no了,因为已经不存在这样的键盘了。
如果当前字母出现过,判断pos当前索引的位置前面或者后面的字母等于当前字母,我们就把pos移到那个位置上面去,当然这里要判断pos+1或者pos-1是否合法,如果不是上面的情况,是其他情况的话那也可以直接输出NO了
活到最后的就是胜利者,我们直接把那些没有出现过的字母加在ans后面就可以啦。
好啦上代码啦~~

#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;

int used[27];

void solve()
{
	mst(used, 0);
	string s;
	cin >> s;
	int n = s.size();
	string t(1, s[0]);
	int pos = 0;
	used[s[0] - 'a'] = 1;
	
	for (int i = 1; i < n; i++)
	{
		if (used[s[i] - 'a'])
		{
			if (pos > 0 && s[i] == t[pos - 1])
			{
				pos--;
			}
			else if (pos + 1  < t.size() && s[i] == t[pos + 1])
			{
				pos++;
			}
			else 
			{
				cout << "NO\n";
				return;
			}
		}
		else
		{
			if (!pos)
			{
				t = s[i] + t;
			}
			else if (pos == t.size() - 1)
			{
				t += s[i];
				pos++;
			}
			else
			{
				cout << "NO\n";
				return;
			}
		}
		used[s[i] - 'a'] = 1;
	}
	for (int i = 0; i < 26; i++)
	{
		if (!used[i])
		{
			t += ('a' + i);
		}
	}
	cout << "YES\n";
	cout << t << endl;
}

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

待会见噢~

发布了53 篇原创文章 · 获赞 2 · 访问量 1360

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/104464281
今日推荐