/* 问题描述 在线性代数里有这么一个概念:有一个数列,如21543, 1的前面有1个数比它要大,4的前面有1个数比它大, 3的前面有2个数比它大,总数是1+1+2=4 所以21543的逆序数就是4 输入 多组测试数据,第一行是n(1<=n<=1e7),下一行是一个长度为n的字符串 输出 算出这个字符串的逆序数(ASCII比较) 样例输入 5 21543 3 123 6 654321 4 acdb 6 abcABC 4 2211 样例输出 4 0 15 2 9 4 难度:Very Easy */ #include <cstdio> int main() { const int ASCII_COUNT = 256; // ASCII字符数 int occurance[ASCII_COUNT]; // 记录每个ASCII字符的出现次数 char ch; // 当前字符 char max = 0; // 出现过ASCII码最高的字符 int n = 0; // 题目中的n long long result = 0; // 结果 while( scanf("%d", &n) != EOF ) { // 先处理掉遗留的回车 getchar(); // 重置所有变量 result = 0; max = 0; for( int i = 0; i < ASCII_COUNT; i++ ) occurance[i] = 0; // 扫描所有字符, 进行统计 for( int i = 0; i < n; i++ ) { // 获得当前字符 ch = getchar(); // 累加当前字符出现次数 occurance[(int) ch]++; if( ch > max ) max = ch; // 从出现过的最大字符开始往前扫到当前字符, 统计大于当前字符的字符数 for( int j = max; j > ch; j-- ) result += occurance[j]; } printf("%lld/n", result); // 输出结果 // printf("%I64d/n", result); // 在雨中飞燕提交时要用这一句输出 long long } return 0; }