垂死挣扎-4
现在有一个字符串,你要对这个字符串进行 n 次操作,每次操作给出两个数字:(p, l) 表示当前字符串中从下标为 p 的字符开始的长度为 l 的一个子串。你要将这个子串左右翻转后插在这个子串原来位置的正后方,求最后得到的字符串是什么。字符串的下标是从 0 开始的,你可以从样例中得到更多信息。
输入描述:
每组测试用例仅包含一组数据,每组数据第一行为原字符串,长度不超过 10 ,仅包含大小写字符与数字。接下来会有一个数字 n 表示有 n 个操作,再接下来有 n 行,每行两个整数,表示每次操作的(p , l)。
保证输入的操作一定合法,最后得到的字符串长度不超过 1000。
输出描述:
输出一个字符串代表最后得到的字符串。
输入例子:
ab 2 0 2 1 3
输出例子:
abbaabb
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
string str;
while (cin>>str) {
int n;
cin >> n;
while (n --) {
int beg,len,index;
cin>>beg>>len;
string temp = str.substr(beg,len);
index = beg + len;
reverse(temp.begin(), temp.end());
str.insert(index, temp);
}
cout<<str<<endl;
}
return 0;
}
给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。
比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。
输入描述:
每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。 满足 0 < x , k ≤ 2,000,000,000。
输出描述:
输出一个数y。
输入例子:
5 1
输出例子:
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <iostream> #include <bitset> using namespace std; int main() { unsigned long long x, y = 1, k; cin >> x >> k; std::bitset<64> xbs(x), kbs(k); for ( size_t i = 0, kpos = 0; i < xbs.size(); ++i) { if (! xbs.test(i)) { // xbs[i] == 0 xbs.set(i, kbs[kpos++]); } } y = xbs.to_ullong(); y ^= x; cout << y << endl; return 0; } |