Codeforces Round #327 (Div. 2) B. Rebranding C. Median Smoothing

                              B. Rebranding

The name of one small but proud corporation consists of n lowercase English letters. The Corporation has decided to try rebranding — an active marketing strategy, that includes a set of measures to change either the brand (both for the company and the goods it produces) or its components: the name, the logo, the slogan. They decided to start with the name.

For this purpose the corporation has consecutively hired m designers. Once a company hires the i-th designer, he immediately contributes to the creation of a new corporation name as follows: he takes the newest version of the name and replaces all the letters xiby yi, and all the letters yi by xi. This results in the new version. It is possible that some of these letters do no occur in the string. It may also happen that xi coincides with yi. The version of the name received after the work of the last designer becomes the new name of the corporation.

Manager Arkady has recently got a job in this company, but is already soaked in the spirit of teamwork and is very worried about the success of the rebranding. Naturally, he can‘t wait to find out what is the new name the Corporation will receive.

Satisfy Arkady‘s curiosity and tell him the final version of the name.

Input

The first line of the input contains two integers n and m (1 ≤ n, m ≤ 200 000) — the length of the initial name and the number of designers hired, respectively.

The second line consists of n lowercase English letters and represents the original name of the corporation.

Next m lines contain the descriptions of the designers‘ actions: the i-th of them contains two space-separated lowercase English letters xiand yi.

Output

Print the new name of the corporation.

Sample test(s)

input

6 1policep m

output

molice

input

11 6abacabadabaa bb ca de gf ab b

output

cdcbcdcfcdc

Note

In the second sample the name of the corporation consecutively changes as follows:

  一道想法题目:无非就是字符 x 最后映射成了另一个字符 y,操作的也就是a,b,c,d...z这26个字符。初始化ch[i]存放的是第i个字符, pos[i]=i,记录第i个字符的位置。那么 a<->b互换,也就是在ch[]中交换a,b两个字符的位置(通过pos[a-‘a‘] 和 pos[b-‘a‘]找到),并同时交换pos[]的值。最终ch[i]表示字符i+‘a‘映射的字符。

#include<iostream>
#include<cstdio>
#include<map>
#define N 200005
using namespace std;
char str[N];
int pos[30], ch[30];

int main(){
    int n, m;
    scanf("%d%d%s", &n, &m, str);
    getchar();
    for(int i=0; i<26; ++i)
        pos[i] = ch[i] = i;
    char s[4];
    while(m--){
        gets(s);
        if(s[0] == s[2]) continue;
        swap(ch[pos[s[0]-‘a‘]], ch[pos[s[2]-‘a‘]]);
        swap(pos[s[0]-‘a‘], pos[s[2]-‘a‘]);
    }
    for(int i=0; i<n; ++i)
        printf("%c", ch[str[i]-‘a‘]+‘a‘);
    printf("\n");
    return 0;
}

                        C. Median Smoothing

A schoolboy named Vasya loves reading books on programming and mathematics. He has recently read an encyclopedia article that described the method of median smoothing (or median filter) and its many applications in science and engineering. Vasya liked the idea of the method very much, and he decided to try it in practice.

Applying the simplest variant of median smoothing to the sequence of numbers a1, a2, ..., an will result a new sequence b1, b2, ..., bnobtained by the following algorithm:

  • b1 = a1, bn = an, that is, the first and the last number of the new sequence match the corresponding numbers of the original sequence.
  • For i = 2, ..., n - 1 value bi is equal to the median of three values ai - 1, ai and ai + 1.

The median of a set of three numbers is the number that goes on the second place, when these three numbers are written in the non-decreasing order. For example, the median of the set 5, 1, 2 is number 2, and the median of set 1, 0, 1 is equal to 1.

In order to make the task easier, Vasya decided to apply the method to sequences consisting of zeros and ones only.

Having made the procedure once, Vasya looked at the resulting sequence and thought: what if I apply the algorithm to it once again, and then apply it to the next result, and so on? Vasya tried a couple of examples and found out that after some number of median smoothing algorithm applications the sequence can stop changing. We say that the sequence is stable, if it does not change when the median smoothing is applied to it.

Now Vasya wonders, whether the sequence always eventually becomes stable. He asks you to write a program that, given a sequence of zeros and ones, will determine whether it ever becomes stable. Moreover, if it ever becomes stable, then you should determine what will it look like and how many times one needs to apply the median smoothing algorithm to initial sequence in order to obtain a stable one.

Input

The first input line of the input contains a single integer n (3 ≤ n ≤ 500 000) — the length of the initial sequence.

The next line contains n integers a1, a2, ..., an (ai = 0 or ai = 1), giving the initial sequence itself.

Output

If the sequence will never become stable, print a single number  - 1.

Otherwise, first print a single integer — the minimum number of times one needs to apply the median smoothing algorithm to the initial sequence before it becomes is stable. In the second line print n numbers separated by a space  — the resulting sequence itself.

Sample test(s)

input

40 0 1 1

output

00 0 1 1

input

50 1 0 1 0

output

20 0 0 0 0

Note

In the second sample the stabilization occurs in two steps: , and the sequence 00000 is obviously stable.

构造题目:如果a[i]==a[i+1]那么a[i]和a[i+1]都是stable的数字,通过stable的数字将原串分成多个串Si,形如0101(或1010), 01010(10101) 。

原串最终成为stable的次数,也就是子串Si成为stable变换次数的最大值。那么如何计算子串Si成为stable的次数呢?其实找一下规律就好了!

0101.....10,这样的序列,区间为[l, r], a[l]==a[r]最终变成稳定序列 0000...00。变换的次数为(r-l+1)/2;

0101.....01,这样的序列,区间[l, r], a[l]!=a[r]最终变成稳定序列0000.....1111。0和1各占一半。变换的次数为(r-l+1)/2 -1。

#include<iostream>
#include<cstdio>
#define N 500005
using namespace std;
int a[N];
int main(){
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
        scanf("%d", &a[i]);
    int ans = 0;
    for(int i=1; i<=n;){
        int j = i;
        while(j+1<=n && a[j]!=a[j+1])
            ++j;
        //[i, j]这段区间需要作调整, 其中第i个位置和第j个位置的数字已经是stable
        int len = j-i+1;
        if(a[i] == a[j]) {//形如01010
            for(int k=i+1; k<=j; ++k)
                a[k] = a[i];
            ans = max(ans, len/2);
        } else {//形如 010101
            int k;
            for(k=i+1; k<=(i+j)/2; ++k)
                a[k] = a[i];
            for(k; k<j; ++k)
                a[k] = a[j];
            ans = max(ans, len/2-1);
        }
        i = j+1;
    }
    printf("%d\n", ans);
    for(int i=1; i<=n; ++i){
        if(i!=1) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    return 0;
}
时间: 2025-01-15 11:21:23

Codeforces Round #327 (Div. 2) B. Rebranding C. Median Smoothing的相关文章

Codeforces Round #327 (Div. 2) B. Rebranding 模拟

B. Rebranding The name of one small but proud corporation consists of n lowercase English letters. The Corporation has decided to try rebranding — an active marketing strategy, that includes a set of measures to change either the brand (both for the

Codeforces Round #327 (Div. 2) B Rebranding

1 /* 2 3 自从做了DP专题就没做cf惹,然而并没有什么用哇= =dp还是没啥赶脚,cf也欠了一大堆哇,还是渣渣哦多克! 4 题意: 5 给出字符串长度和要互换的字母组数,求互换后的串. 6 把每个字母最后换成啥保存起来最后输出即可. 7 */ 8 #include<cstdio> 9 #include<algorithm> 10 #include<cstring> 11 using namespace std; 12 const int maxn=200005;

Codeforces Round #327 (Div. 2)-Wizards&#39; Duel

题意: 在一条长度为l的走廊,两个人站在走廊的左右两端分别以p,q的速度走来,问他们相遇时离左端的距离是多少? 思路: 非常简单的暴力题,不解释. 代码如下: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <fstream> 5 #include <ctime> 6 #include <cmath> 7 #include <cs

随笔—邀请赛前训—Codeforces Round #327 (Div. 2) Rebranding

题意:一个字符串,做n次变换,每次变换是把a字符与b字符全部调换.求全部调换完成后的字符串. 这道题目我一开始理解错意思了,理解成将所有a字符变成b字符,我觉得这样出貌似还更有挑战性一点..口亨 #include<cstdio> #include<cstring> #include<map> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y))

Codeforces Round #327 (Div. 1), problem: (A) Median Smoothing

http://codeforces.com/problemset/problem/590/A: 在CF时没做出来,当时直接模拟,然后就超时喽. 题意是给你一个0 1串然后首位和末位固定不变,从第二项开始到倒数第二项,当前的a[i]=(a[i-1],a[i],a[i+1])三项排序后的中间项,比如连续3项为 1 0 1,那么中间的就变为1,然后题目让你输出达到稳定状态时所需的最小步数,不能的话输出-1. 无论给你啥数列,都能达到稳态.所以不可能输出-1: 还有一开始就稳定不变,或经过几次变换而稳定

Codeforces Round #327 (Div. 1) D. Top Secret Task

题意: 给了一个n,k,s,和一个数组,求使用小于s次的交换使得前k个整数的和尽可能的小,交换指的的是相邻的两个数交换, 首先考虑 如果最小的k个数全部再最后面,那么至少要花费 ( n - k + 1 + n)*k/2 - (( k + 1 ) * k / 2) 这么多下才能把这k个数搬运到最前面,也就是说如果s他大于等于这个数 那么答案一定是最小的那k个数, 否则进行下面的做法 假设前k个数 在最初的 那个数组中的下标分别是L1<L2<...<Lk,肯定被选中的那k个数他们的相对位置肯

暴搜 - Codeforces Round #327 (Div. 2) E. Three States

E. Three States Problem's Link Mean: 在一个N*M的方格内,有五种字符:'1','2','3','.','#'. 现在要你在'.'的地方修路,使得至少存在一个块'1','2'和'3'是连通的. 问:最少需要修多少个'.'的路. analyse: 想法题,想到了就很简单. 直接暴力枚举每个国家到每个可达的点的最小代价,然后计算总和取最小值. dis[k][x][y]表示第k个国家到达坐标(x,y)的点的最小代价. Time complexity: O(N) vi

Codeforces Round #327 (Div. 2)C. Median Smoothing 构造

C. Median Smoothing A schoolboy named Vasya loves reading books on programming and mathematics. He has recently read an encyclopedia article that described the method of median smoothing (or median filter) and its many applications in science and eng

E. Three States - Codeforces Round #327 (Div. 2) 591E(广搜)

题目大意:有一个M*N的矩阵,在这个矩阵里面有三个王国,编号分别是123,想知道这三个王国连接起来最少需要再修多少路. 分析:首先求出来每个王国到所有能够到达点至少需要修建多少路,然后枚举所有点求出来最少的即可. 代码如下: --------------------------------------------------------------------------------------------------------- #include<stdio.h> #include<