icpc:problems:usaco22open_photoshoot_b
目录
problems | |
---|---|
名称 | Photoshoot B |
题目编号 | USACO22OPEN_B1 |
题目链接 | luogu.com.cn/… |
来源 | USACO |
算法分类 | 字符串, 思想 |
难易程度 | 看懂题解 |
Photoshoot B
想法
当反转一次前缀时,前缀中处于奇数位置的G会变到偶数位置,处于偶数位置的G会变到奇数位置。如果将字符串以2为长度分块,会发现每个块内的G与H的位置会发生翻转。
所以将长度为2的块中不同的块取出,根据是否需要翻转重新构建一个bool序列,在序列中当true与false交替时需要前缀翻转,统计交替次数也就是统计需要翻转的次数。
代码实现
#include<iostream> #include<vector> using namespace std; int main() { int n, cnt=0; cin >> n; vector<char>line(n); vector<bool>s; for(char& i : line) cin >> i; for (int i = 0; i < n; i=i+2) if(line[i] != line[i+1]) { if(line[i] == 'G') s.push_back(true); else s.push_back(false); } s.push_back(false); for (int i = 0; i < (int)s.size()-1; ++i) { if(s[i] ^ s[i+1]) cnt++; } cout << cnt; return 0; }
/app/www/public/data/pages/icpc/problems/usaco22open_photoshoot_b.txt · 最后更改: 2023/02/08 10:23 由 温婕莺