题意

第一行给定两个数字\(n\) \(m\) \((m \ge n)\)分别代表给定字符串长度以及需要构造出的字符串长度

第二行给定一个长度为\(n\)的字符串 (假设原来的字符串是\(a\) 需要构造出来的字符串是 \(x\))

构造出的字符串需要满足 子序列与子串的定义

1.\(x\)的任意一个子串都与\(a\)不相同

2.\(x\)的某一个子序列和\(a\)相同

分析

  • 当 \(n=1\)的时候,显然无法存在\(x\)满足条件
  • 当 \(n=2\)的时候,如果两个字符串中的字符不同,显然构造不出
  • 当 \(n=m\)的时候,显然满足条件\(2\)的时候,\(x\)与\(y\)是一模一样的,无法满足条件\(1\)

假设现在以上三种情况均不可能发生

  • 我们可以找到每个与 他的下一个字符相同的字符,然后在这样一对字符中间加入一个与他们不相同的字符
  • 如果找不到在第一个字符(除了最后一个的任意一个字符均可)后面输出与它不相同的字符即可

AC_CODE

#define pb push_back
#include <bits/stdc++.h>
#define rep(i, b, s) for(int i = (b); i <= (s); ++i) using namespace std;
void solve() {
int n, m; scanf("%d%d", &n, &m);
string a; cin >> a;
// 三种不可能构造出的情况
if(n == 1 || n == m || n == 2 && a[0] != a[1]) {
puts("-1");
return;
}
//构造方式为找到每个与 他的下一个字符相同的字符,然后在这样一对字符中间加入一个与他们不相同的字符
// 如果找不到在第一个字符(除了最后一个的任意一个字符均可)后面输出与它不相同的字符即可 //寻找出 每个与 他的下一个字符相同的字符 存起来
vector<int> v;
for(int i = 0; a[i + 1]; i ++)
if(a[i] == a[i + 1]) {
v.pb(i);
}
int len = v.size(); if(!len) { // 找不到的情况
putchar(a[0]);
for(int i = 0; i < m - n; i ++ ) putchar(a[0] ^ 1);
rep(i, 1, n - 1) putchar(a[i]);
puts("");
return;
} int p = 0;
int ans = m - n;
for(int i = 0; a[i]; i ++ ) { // 找到了这样的字符
putchar(a[i]);
if(i == v[p] && ans) {
putchar(a[i] ^ 1);
p ++; ans --;
if(p == len) {
rep(j, 1, ans) putchar(a[i] ^ 1);
ans = 0;
}
}
}
puts("");
} signed main()
{
int T = 1;cin >> T;
while(T -- ) solve();
return 0;
}

最新文章

  1. Lua的string和string库总结
  2. AsyncTask的初步了解
  3. Cocos2d-x 3.2 学习笔记(七)Scene And Transition
  4. 深入了解Windows
  5. Find the Duplicate Number
  6. JQuery源码解析(十)
  7. js 传参报错 参数含有数字、字母组合的字符串SyntaxError: identifier starts immediately after numeric literal
  8. [leetcode]_Merge Two Sorted Lists
  9. Java 网络编程(一)
  10. Android 怎样把光标放在EditText中文本的末尾处?
  11. 【C#、csharp】HTTPGET,POST请求
  12. Angular4 后台管理系统搭建(2) - flexgrid 单元格模板 wjFlexGridCellTemplate 的坑
  13. maven3自定义archetype
  14. Java定时器应用
  15. 【Java提高】---枚举的应用
  16. 【LightOJ1259】Goldbach`s Conjecture(数论)
  17. px与rem的换算
  18. vSphere虚拟化管理平台的功能
  19. webpack 中文文档
  20. 02:奇数单增序列 个人博客doubleq.win

热门文章

  1. LeetCode 第三大的数414. Third Maximum Number
  2. wiodows /linux CMD
  3. 新手入门typeScript
  4. Java工程编码格式由GBK转化成utf-8(编码格式互转)
  5. 使用 JavaScript 用循环嵌套输出乘法表。外循环控制行数,内循环控制当前行要输出的乘法表达式,在页面上输出九九乘法表
  6. 在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决
  7. xorm 条件查询时区的问题
  8. linux(CentOS7) 之 jdk1.8 下载及安装
  9. Oracle:使用PL-SQL登录时报ORA-12541:无监听程序的解决办法
  10. nginx - win系统启动一闪而过 ,服务没有启动成功