Combination Lock

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

Combination LockCombination Lock

Finally, you come to the interview room. You know that a Microsoft interviewer is in the room though the door is locked. There is a combination lock on the door. There are N rotators on the lock, each consists of 26 alphabetic characters, namely, 'A'-'Z'. You need to unlock the door to meet the interviewer inside. There is a note besides the lock, which shows the steps to unlock it.

Note: There are M steps totally; each step is one of the four kinds of operations shown below:

Type1: CMD 1 i j X: (i and j are integers, 1 <= i <= j <= N; X is a character, within 'A'-'Z')

This is a sequence operation: turn the ith to the jth rotators to character X (the left most rotator is defined as the 1st rotator)

For example: ABCDEFG => CMD 1 2 3 Z => AZZDEFG

Type2: CMD 2 i j K: (i, j, and K are all integers, 1 <= i <= j <= N)

This is a sequence operation: turn the ith to the jth rotators up K times ( if character A is turned up once, it is B; if Z is turned up once, it is A now. )

For example: ABCDEFG => CMD 2 2 3 1 => ACDDEFG

Type3: CMD 3 K: (K is an integer, 1 <= K <= N)

This is a concatenation operation: move the K leftmost rotators to the rightmost end.

For example: ABCDEFG => CMD 3 3 => DEFGABC

Type4: CMD 4 i j(i, j are integers, 1 <= i <= j <= N):

This is a recursive operation, which means:

If i > j:

	Do Nothing

Else:

	CMD 4 i+1 j

	CMD 2 i j 1

For example: ABCDEFG => CMD 4 2 3 => ACEDEFG

输入

1st line:  2 integers, N, M ( 1 <= N <= 50000, 1 <= M <= 50000 )

2nd line: a string of N characters, standing for the original status of the lock.

3rd ~ (3+M-1)th lines: each line contains a string, representing one step.

输出

One line of N characters, showing the final status of the lock.

提示

Come on! You need to do these operations as fast as possible.

 

样例输入
7 4

ABCDEFG

CMD 1 2 5 C

CMD 2 3 7 4

CMD 3 3

CMD 4 1 7
样例输出
HIMOFIN
 1 #include <iostream>

 2 #include <stdlib.h>

 3 #include <cstdio>

 4 #include <string>

 5 #include <vector>

 6 #include <stack>

 7 #include <map>

 8 #include <queue>

 9 

10 using namespace std;

11 

12 void cmd1(string &str, int i, int j, char c) {

13     for (int m = i; m <= j; ++m) {

14         str[m - 1] = c;

15     }

16 }

17 

18 void cmd2(string &str, int i, int j, int k) {

19     for (int m = i; m <= j; ++m) {

20         int v = (str[m - 1] - 'A' + k) % 26;

21         str[m - 1] = 'A' + v;

22     }

23 }

24 

25 void reverse(string &str, int i, int j) {

26     while (i < j) {

27         swap(str[i], str[j]);

28         i++, j--;

29     }

30 }

31 

32 void cmd3(string &str, int k) {

33     reverse(str, 0, k - 1);

34     reverse(str, k, str.length() - 1);

35     reverse(str, 0, str.length() - 1);

36 }

37 

38 void cmd4(string &str, int i, int j) {

39     if (i > j) return;

40     //cmd4(str, i + 1, j);

41     //cmd2(str, i, j, 1);

42     for (int m = i; m <= j; ++m) {

43         int v = (str[m - 1] - 'A' + m - i + 1) % 26;

44         str[m - 1] = 'A' + v;

45     }

46 }

47 

48 int main(int argc, char** argv) {

49     int n, m;

50     cin >> n >> m;

51     string input;

52     cin >> input;

53 

54     for (int step = 0; step < m; ++step) {

55         string cmd; 

56         int type, i, j, k; 

57         char c;

58         cin >> cmd >> type;

59         if (type == 1) {

60             cin >> i >> j >> c;

61             cmd1(input, i, j, c);

62         } else if (type == 2) {

63             cin >> i >> j >> k;

64             cmd2(input, i, j, k);

65         } else if (type == 3) {

66             cin >> k;

67             cmd3(input, k);

68         } else if (type == 4) {

69             cin >> i >> j;

70             cmd4(input, i, j);

71         }

72     //cout << input << endl;

73     }

74 

75     cout << input << endl;

76     return 0;

77 }

老是TLE。估计是递归开销太大了。分析了一下改成迭代的了。也不知道对不对。。。

你可能感兴趣的:(Lock)