题目
误码率是最常用的数据通信传输质量指标。它可以理解为“在多少位数据中出现一位差错”。移动通信 网络中的误码率主要是指比特误码率,其计算公式如下:比特误码率=错误比特数/传输总比特数。为了简单,我们使用字符串来标识通信的信息,一个字符错误了,就认为出现了一个误码输入一个标准的字符串,和一个传输后的字符串,计算误码率字符串会被压缩。
例:“2A3B4D5X1Z”表示"AABBBDDDDXXXXXZ"
用例会保证两个输入字符串解压后长度一致,解压前的长度不一定一致每个生成后的字符串长度<100000000.
输入描述
两行,分别为两种字符串的压缩形式。
每行字符串(压缩后的) 长度<100000
输出描述
一行,错误的字数量/展开后的总长度
备注
注意: 展开后的字符串不含数字
示例1:
输入
3A3B
2A4B
输出
1/6
示例2:
输入
5Y5Z
5Y5Z
输出
0/10
示例3:
输入
4Y5Z
9Y
输出
5/9
Code
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<exception>
#include<map>
#include<cmath>
#include<unordered_map>
#include<numeric>
#include<set>
#include<climits>
#include<ctype.h>
#include<queue>
#include<stack>
#include<list>
#include<bitset>
using namespace std;
vector<int> split(string params_str) {
vector<int> p;
while (params_str.find(" ") != string::npos) {
int found = params_str.find(" ");
p.push_back(stoi(params_str.substr(0, found)));
params_str = params_str.substr(found + 1);
}
p.push_back(stoi(params_str));
return p;
}
vector<string> split_str(string params_str) {
vector<string> p;
while (params_str.find(" ") != string::npos) {
int found = params_str.find(" ");
p.push_back(params_str.substr(0, found));
params_str = params_str.substr(found + 1);
}
p.push_back(params_str);
return p;
}
vector<vector<string>> getsplitStr(string s) {
vector<vector<string>> strs;
string num_str = "";
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (c >= '0' && c <= '9') {
num_str+=c;
} else {
strs.push_back(vector<string> {num_str, string(1, c)});
num_str = "";
}
}
return strs;
}
int main()
{
string s1 ,s2;
getline(cin, s1);
getline(cin, s2);
vector<vector<string>> strsA = getsplitStr(s1);
vector<vector<string>> strsB = getsplitStr(s2);
int diff_count = 0;
int same_count = 0;
while (strsA.size() > 0) {
vector<string> splitStr1 = strsA[0];
vector<string> splitStr2 = strsB[0];
strsA.erase(strsA.begin());
strsB.erase(strsB.begin());
// 取前缀数字的最小
int prefix_diff = min(stoi(splitStr1[0]), stoi(splitStr2[0]));
if (splitStr1[1] != splitStr2[1]) {
diff_count += prefix_diff;
} else {
same_count += prefix_diff;
}
if (stoi(splitStr1[0]) > prefix_diff) {
splitStr1[0] =stoi(splitStr1[0]) - prefix_diff + '0';
strsA.insert(strsA.begin(), splitStr1);
continue;
}
if (stoi(splitStr2[0]) > prefix_diff) {
splitStr2[0] =stoi(splitStr2[0]) - prefix_diff + '0';
strsB.insert(strsB.begin(), splitStr2);
}
}
cout<<diff_count << "/" << diff_count + same_count;
return 0;
}