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

5 1

lehho

h l

11 6

abacabadaba

a b

b c

a d

e g

f a

b b

Sample Output

hello

cdcbcdcfcdc

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[26];
    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=0;i<26;i++)
        {
            while(!v[i].empty())
            {
                it=v[i].back(),v[i].pop_back();
                *it=i+‘a‘;
            }
        }
        cout<<s<<endl;
    }
    return 0;
}
时间: 2024-08-29 14:40:57

ZUFE(周赛) 2326 交换字母(STL)的相关文章

排列字母stl

#include<iostream> #include<string> #include<vector> //vector的头文件 #include<algorithm> //next_permutation prev_permutation的头文件,排列无重复 using namespace std; int main() { string s; vector<string> v; //容器内存有大小,以及容量 int x,y,z,q; int

HLJU周赛5解题报告

Problem A: 求第K大数 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 81  Solved: 32 [Submit][Status][Web Board] [Edit] [TestData] Description 一天,喜欢看电影的DoubleQ 和 XXZ 来到一个神奇的电影院,这个电影院可以同时放映n部电影,每部电影都有相应的票价xi,面对着杀破狼2,侏罗纪世界,少年班等等好看的电影,他们最后商量,看票价第K大的电影,但是由于电影

字母转换

时限:1000ms 内存限制:10000K  总时限:3000ms 描述 通过栈交换字母顺序.给定两个字符串,要求所有的进栈和出栈序列(i表示进栈,o表示出栈),使得字符串2在求得的进出栈序列的操作下,变成字符串1.输出结果需满足字典序.例如TROT 到 TORT:[i i i i o o o oi o i i o o i o] 输入 给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串. 输出 所有的进栈和出栈序列,输出结果需满足字典序 输入样例 madam adamm baha

信STL,得永生(STL大法好)

STL大法好! 当然,是不可能得永生的,但它可以延长你的在役时间 最近总结了一些STL的神奇用法,C++的STL和作弊器一样,简直kongbu...... 所以说,我们一起来看看STL的用法吧! 目录: 1.vector 2.stack 3.queue&priority_queue 4.string 5.map 6.set&multiset 7.list 8.pair 9.bitset 10.algorithm 当然,这只会是一个大致的讲解,不会非常详细 vector vector,就是不

最佳vim技巧

最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim.org         : 官方站点comp.editors        : 新闻组http://www.newriders.com/books/opl/ebooks/0735710015.html : Vim书籍http://vimdoc.sourceforge.net/cgi-bin/vim

牛人的ACM经验 (转)

一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中) 4,图(基本概念,存储结构,图的运算) 数学知识 1,离散数学知识的应用(如排列组合.简单的图论,数 理逻辑) 2,数论知识 3,线性代数 4,组合代数 5,计算几何 二 算法 1,排序算法(冒抛法,插入排序,合并排序,快速排 序,堆排序) 2,查找(顺序查找,二分发) 3,回溯算法 4,递归算

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排

对于enigma machine的破解

最近看到一篇文章,详细讲解了二战时期德军的enigma machine是怎样被破解的.enigma machine本质上是利用substitution cipher的原理来进行加密的. 1)替换加密的原理及破解方法 在古代,当人们想要对一段文字进行加密时,会把原文(即明文)中的字母按照某种配对关系替换成其他的字母,从而得到一段别人看不懂的密文. 例如我们可以按照以下的配对关系对明文进行加密: 在加密过程中,第一行明码表中的字母分别被替换成位于该字母下方的大写字母.加密结束后,将会得到一段不经解密

uva11552

题意: 给一个长度为n的串n<1000然后将这个串平均分成k分,分别为 s1 s2 s3...sk,这k份中可以任意的交换字母位置 比如uuvuwwuv 切成两份 这样 uuvu 和wwuv 这样然后 重新整理一下就得到了 uuuv 和vuww 这样合并uv和vuw 在将两个合并 得到 uvuw 为4 个能在消的字符,问最后最小的结果是多少.刚开始考虑 交换他们的不同匹配,因为只要考虑两端就行了,贪心的进行交换结果wa了, 考虑dp[i][c]表示在第i部分的末尾放c的最小值,特判只有1种的情况