ZUFE(周赛) 2326 交换字母(STL)
Time Limit: 1 Sec Memory Limit: 128 MB
Description
有一个长度为n的字符串(只包含小写字母),操作m次,每次操作交换两个字母,输出最终字符串。
Input
多组输入,每组第一行为n,m表示字符串长度和操作数,1<n,m<=100000
第二行为长度n的字符串,接下来m行,每行两个字符,中间空格隔开,表示要交换的两个字符。
Output
每组数据输出一行,表示最终字符串。
Sample Input
Sample Output
HINT
In the second sample the name of the corporation consecutively changes as follows:
abacabadaba-->babcbabdbab
babcbabdbab-->cacbcacdcac
cacbcacdcac-->cdcbcdcacdc
cdcbcdcacdc-->cdcbcdcacdc
cdcbcdcacdc-->cdcbcdcfcdc
cdcbcdcfcdc-->cdcbcdcfcdc
题解:如果用一般的方法,也就是真正去交换,数据中给出100000的字符串的话一定会TLE,那么就想到了用数组去保存每种字母的index,这样不必每次输入两个字符都要循环一次。但是,即使这样,刚开始的想法是,交换两个数组的内容,并且修改字符串,说到底实际上还是修改了字符串,所以超时。后来发现,根本不需要每一次都去改变字符串的内容,只要输出的时候改变就好了。
所以,思路是:使用26个数组,先循环一遍字符串,分别保存26个字母的索引(因为用的是string,所以保存的是迭代器),然后,每读取两个字母,就交换(使用swap函数)两个数组,这里v[0]就是‘a',v[1]就是’b',通式是v[ch-‘a']。最后输出的时候,遍历数组并进行修改即可。这样有点像链表,保存了数组的索引。
在这个思路上继续优化,可以再开一个数组,保存26个数组的索引,交换的时候,交换索引,这样就不用交换数组里的元素了。这个代码没写,有兴趣的朋友可以自己动手试试。
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#define ms(a) memset(a,0,sizeof(a))
#define msp memset(mp,0,sizeof(mp))
#define msv memset(vis,0,sizeof(vis))
using namespace std;
//#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
//Start
string s;
vector<string::iterator> v[];
int m,n;
while(cin>>m>>n)
{
cin>>s;
string::iterator it;
for(it=s.begin(); it!=s.end(); it++)
{
v[*it-'a'].push_back(it);
}
char a,b;
while(n--)
{
cin>>a>>b;
v[a-'a'].swap(v[b-'a']);
}
for(int i=;i<;i++)
{
while(!v[i].empty())
{
it=v[i].back(),v[i].pop_back();
*it=i+'a';
}
}
cout<<s<<endl;
}
return ;
}
ZUFE(周赛) 2326 交换字母(STL)的更多相关文章
- Open Cascade Data Exchange STL
Open Cascade Data Exchange STL eryar@163.com 摘要Abstract:介绍了三维数据交换格式STL的组成,以及Open Cascade中对STL的读写.并将O ...
- 关于STL的map的注意事项
关于map是什么,这里就不多叙述了. 直接正题,常用的map插入操作有三种方法:通过pair<key_type,value_type>.通过value_type插入数据.还有一种类似于数组 ...
- php实现字符串的排列(交换)(递归考虑所有情况)
php实现字符串的排列(交换)(递归考虑所有情况) 一.总结 交换: 当有abc的时候,分别拿第一位和其它位交换,第一位固定,余下的位做递归,这样有考虑到所有情况,因为第一位只可能是所有的字母,那第一 ...
- 最佳vim技巧
最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim ...
- <算法竞赛入门经典> 第8章 贪心+递归+分治总结
虽然都是算法基础,不过做了之后还是感觉有长进的,前期基础不打好后面学得很艰难的,现在才慢慢明白这个道理. 闲话少说,上VOJ上的专题训练吧:http://acm.hust.edu.cn/vjudge/ ...
- 我的_vimrc文件
""""""""""""""""&quo ...
- 牛人的ACM经验 (转)
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈 ...
- ACM算法锦集
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...
- UVA 10716 Evil Straw Warts Live(贪心)
Problem D: Evil Straw Warts Live A palindrome is a string of symbols that is equal to itself when re ...
随机推荐
- 终于了解了User-Agent的历史了
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? 1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3 ...
- JS 高效快速的数组去重
Array.prototype.uniquer = function() { var result = [], hash = {}; ; i < this.length; i++) { if ( ...
- CreateMutex()参数报错问题
举例: hMutex = CreateMutex(NULL, FALSE,"screen"); 报错 error C2664:"CreateMutexW": 不 ...
- UGUI事件系统
UGUI系统 将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值. PointerEnter-- PointerExit-- PointerDown-- Pointe ...
- Sonatype Nexus 服务启动失败问题解决
Sonatype Nexus 服务启动失败问题解决 问题前述: 近日在开发机本机安装了 Oracle 数据库快捷版 11g2 之后,重启电脑后发现本机的maven代理服务无法访问. 现象 通过 Win ...
- [Jmeter]jmeter之参数化
一.同一个服务器不同界面访问 a 准备工作: 1.启动jmeter: 2.创建需要访问的url文件,内容示例如下: 即比如:http://www.cnblogs.com/amberly/p/59651 ...
- 使用NCoding归档进行存储数据时候报错
问题:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Demo1.UserInfo ...
- cmake+qt+qtcreator的配置,解决Q_OBJECT的问题
1.如果在编译qt项目的时候,一般头文件里都有Q_OBJECT,但是用cmake来编译的时候,就会报错,那么怎么解决呢? 解决的办法就是要在cmake里面写好配置 命令,再编译的时候,就不会报错了,写 ...
- JavaScript DOM编程艺术-学习笔记(第十章、第十一章)
第十章 1.动画中,因为js的效率高,所以看不见过渡效果 2.题外话:①国外人写书,总是先感谢一遍亲朋好友,最后感谢自己的家人. 3."除非允许用户'冻结'移动的内容,否则应该避免让内容在页 ...
- Winform 无边框窗口移动自定义边框粗细颜色
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...