题目:略(不知道怎么从ZOJ搬题)
地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4054
把这题的每个点分成两种情况看,如果是从这个点开始,0算作2,1算作1,如果是中间点或者是结束点,和前一点的相同看作2,不相同看作1
则我们只需要算出该点的两种权值(之前提到的0算作2,1算作1和前一点的相同看作2,不相同看作1)分别乘以作为起始点出现的次数和作为中间点或者是结束点出现的次数
起始点出现的次数即是其从后向前数的次序,
中间点或者是结束点出现的次数即是(长度-从后向前数的次序)*(从前往后数的次序-1)
#include <iostream> #include <string> #include <string.h> using namespace std; int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { int a, b; string str; cin >> str; int num = 0; long long sum = 0; for (int i = 0; i < str.size(); i++) { a = str[i] - '0'; if (!a) a = 2; if (i) { if (str[i] == str[i - 1]) { b = 2; } else { b = 1; } } sum += a * (str.size() - i) + b * (str.size() - i) * num; num++; } cout << sum << endl; } return 0; }