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;
}
待会见噢~