题目链接


大意:

给出一个串 sss,每次删除其中的一种元素,将剩下的元素加到串 ttt 上,直至将所有元素删完。
现给出串 ttt,输出串 sss 和删除顺序。

思考:

先求出删除顺序:
最后剩下的肯定是最后才删除的,那倒数第二个剩下的就是倒数第二个删除的,依此类推。。
所以从后往前枚举,先出现的为后删除的
将第一次出现的元素依次存下来,遍历完之后翻转就行了。

如何求原串s呢?
类似一种哈希的思想:
最后一定要根据一个串来求出删除后的串的,但是如果时直接枚举的话,复杂度就太大了。
于是我们先根据一些限制筛选掉很大一部分,然后就可以暴力判断是否是答案了。

将每一次删除元素后加进来的串看成一组,那整个串 ttt 就分成了若干组:第一组为原串,第二组为删除一种元素后的串,第三组为删除两个元素后的串…

最后删除的元素是存活了所有组的,倒数第二个删除的元素存活的x-1组…

所以我们可以先按照当前枚举的前缀,推算出总共有多少元素。
看其是否与所给汇合串的长度相同

  • 如果小于所给串长度,说明还没枚举到,继续枚举;
  • 如果和所给串长度相同,那当前枚举的前缀可能就是答案,暴力求出总串,判断是否相同;
  • 如果大于所给串长度,那就无解了。
    因为后面继续枚举也是以当前串为前缀,当前串推算出的总元素都大于总串了,那后面的肯定都不满足。

实现:

从前往后遍历每个位置,将从开头到该位置(前缀)看作答案。

预处理出每个元素出现的组数,遍历的时候加上当前元素出现的总组数,得到的数就是当前答案推算出的总串长度。

然后比较其与所给总串的长度大小:

  • 大于所给串长度,输出-1,无解。
  • 等于所给串长度,暴力求总串,判断是否与所给总串相同。如果是,那这就是答案。

Code:

#define mem(a,b) memset(a,b,sizeof a)
#include<iostream>
#include<cstring>
using namespace std;const int N=500010;
int n,m,A[30];
string a,s,ans;
bool f[30]; bool check(string ans) //还原删除后的串
{string t=ans;for(int k=0;k<s.size();k++){int len=t.size();for(int i=0;i<ans.size();i++){if(ans[i]=='*') continue;if(ans[i]!=s[k]) t+=ans[i];else ans[i]='*';}}if(t==a) return 1;return 0;
}int main(){int T;cin>>T;getline(cin,a);while(T--){getline(cin,a);s=""; //找到删除顺序s mem(f,0);for(int i=a.size()-1;i>=0;i--){if(!f[a[i]-'a']) s+=a[i],f[a[i]-'a']=1;}reverse(s.begin(),s.end());//A[i]表示i元素存活的回合数 for(int i=0;i<s.size();i++) A[s[i]-'a']=i+1;  int sum=0,flag=0;ans="";for(int i=0;i<a.size();i++) //判断以此前缀为答案时,删除后的长度是否和已给串长度相同 {sum+=A[a[i]-'a'];ans+=a[i];if(sum>a.size()) break; //以此前缀为答案,长度大于所给长度,无解 if(sum==a.size()) //长度与所给长度相等,可能为答案 {if(check(ans)){ //还原删除后的串,看是否与所给相同 flag=1;break;}}}if(!flag) cout<<-1<<"\n";else cout<<ans<<" "<<s<<"\n";}return 0;
}

纯暴力过不了,找出最可能是答案的再暴力。好思路。

Codeforces Round #739 (Div. 3) E. Polycarp and String Transformation相关推荐

  1. Codeforces Round #739 (Div. 3)(AK实况)

    Codeforces Round #739 (Div. 3) A. Dislike of Threes 找到第kkk个既不是333的倍数,个位数上也不是333的数,也已预处理然后O(1)O(1)O(1 ...

  2. Codeforces Round #739 (Div. 3) ABCDEF1F2 解题思路

    Codeforces Round #739 (Div. 3) 可能是一开始大佬都写F1去了,我在D写完后发现F过的人数比E多了好多(个位数与十位数),以为F1比较简单,就直接开F1了,但自己分类讨论老 ...

  3. Codeforces Round #739 (Div. 3) 「A B C D E F1 F2」

    Codeforces Round #739 (Div. 3) A. Dislike of Threes 题目描述: 如果一个数能被3整除或者十进制结尾的数字是3则是无趣的数,你想知道第n个有趣的数是什 ...

  4. Codeforces Round #739 (Div. 3) A. Dislike of Threes

    Codeforces Round #739 (Div. 3)的其他题解在这 A. Dislike of Threes 题目大意: 输出第k个结尾数字不是3且不能被3整除的数 思路: 先初始化一下,然后 ...

  5. Codeforces Round #739 (Div. 3)题解A-E

    A.Dislike of Threes Problem - A - Codeforces 题意: Polycarp不喜欢在十进制表示中可以被3整除的整数 或以数3字结尾的整数. Polycarp 也不 ...

  6. Codeforces Round #468 (Div. 2): E. Game with String

    题目链接:http://codeforces.com/contest/931/problem/E 题意:S和Y玩游戏,S首先在纸上写一个长度为n的字符串给Y看,之后在心里将这个字符串循环移位k位 然后 ...

  7. Codeforces Round #445 div.2 D. Restoration of string 乱搞

    D. Restoration of string 题意:给你n个字符串,让你构造一个终串,使得这n个字符串都是终串的最小频繁子串,如果不存在输出NO.  最频繁子串:出现次数最多的子串 tags: 直 ...

  8. CodeCraft-19 and Codeforces Round #537 (Div. 2)解题报告

    Codeforces Round #537 (Div. 2) 题解报告 A. Superhero Transformation 题意 问能否通过把辅音字母换成另一个辅音字母,元音字母换成另一个元音字母 ...

  9. Codeforces Round #734 (Div. 3) 题解

    Hello大家好,今天给大家带来的是 Codeforces Round #734 (Div. 3) 的全题目讲解. 本文链接:https://www.lanqiao.cn/questions/2040 ...

  10. Codeforces Round #381 (Div. 1) A. Alyona and mex 构造

    传送门 文章目录 题意: 思路: 题意: 你需要确定一个长度为nnn的数组aaa,满足给定的mmm个[l,r][l,r][l,r]限制,需要保证构造出来的aaa数组对于每个[l,r][l,r][l,r ...

最新文章

  1. NeurIPS 2021 | 寻MixTraining: 一种全新的物体检测训练范式
  2. 3行代码实现从excel中读取出某列元素为所想要的元素集合中的所有行
  3. AngularJS:如何使用自定义指令来取代ng-repeat
  4. 链接服务器 '(null)' 的 OLE DB 访问接口'STREAM' 返回了对列 '[!BulkInsert].field' 无效的数据...
  5. 转载:https://blog.csdn.net/dcrmg/article/details/52939318
  6. 人工智能的概念和知识构架_概念验证:玩! 构架
  7. hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...
  8. spring boot开发环境搭建
  9. html设计有项目的页面,HTML+CSS项目开发经验总结(推荐)
  10. mysql导入.sql文件
  11. c++程序添加资源文件及释放文件
  12. Redies tutorial
  13. 绘制地图其实并不难!如何绘制地图?看看Smartbi的制作方法
  14. Knockout+RequireJS+Sammy搭建简单的SPA脚手架
  15. 安卓app保持屏幕常亮
  16. 创建临时文件及文件夹
  17. 飞机计算机系统叫什么,飞机电脑和个人电脑有什么不同?
  18. C# .Net通过pythonnet调用python pyd文件
  19. 面试中关于Redis的问题
  20. Jetson TX2 镜像拷贝和烧写

热门文章

  1. 计算机表格复制粘贴,在Excel同一个工作表中,如何复制表格格式(excel表格粘贴复制技巧)...
  2. 案例:恒丰银行——大数据实时流处理平台
  3. php对接抖音小程序担保支付/头条小程序担保支付
  4. [ROS2基础]launch 文件和多节点进程
  5. OVM免费混合虚拟化系列教程之一:关于配置要求!
  6. 获取Linux系统的网卡ip地址
  7. 双绞线 计算机考试,计算机基础知识:有线传输介质之双绞线
  8. plotyy函数_Matlab plotyy函数的使用及问题总结
  9. matlab plotyy 属性如何调整,(完整word版)matlab中plotyy函数加入双y轴说明的方法
  10. 联想昭阳E43L笔记本无线开关停掉解决方案