求字符数组逆序数(poj1007)

int InversionNumber(char* s,int len)

  • {
  • int ans=0;  //s逆序数
  • int A,C,G;  //各个字母出现次数,T是最大的,无需计算T出现次数
  • A=C=G=0;
  • for(int i=len-1;i>=0;i--)
  • {
  • switch(s[i])
  • {
  • case ‘A‘:A++;break;  //A是最小的,无逆序数
  • case ‘C‘:
  • {
  • C++;
  • ans+=A;  //当前C后面出现A的次数就是这个C的逆序数
  • break;
  • }
  • case ‘G‘:
  • {
  • G++;
  • ans+=A;
  • ans+=C;
  • break;
  • }
  • case ‘T‘:
  • {
  • ans+=A;
  • ans+=C;
  • ans+=G;
  • break;
  • }
  • }
  • }
  • return ans;
  • }
时间: 2024-10-29 19:07:06

求字符数组逆序数(poj1007)的相关文章

[树状数组]求排列的逆序数

求排列的逆序数 题目描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它们之间的差异.考虑1,2,-,n的排列i1,i2,-,in,如果其中存在j,k,满足 j < k 且 ij > ik,那么就称(ij,ik)是这个排列的一个逆序. 一个排列含有逆序的个数称为这个排列的逆序数.例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,

求排列的逆序数

考虑1,2,-,n (n <= 100000)的排列i1,i2,-,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一个排列含有逆序的个数称为这个排列的逆序数.例如排列 263451 含有8个 逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8. 现给定1,2,-,n的一个排列,求它的逆序数. 笨办法:O(n2) 分治O(nlogn): 1) 将数组分

《程序设计与算法(二)算法基础》《第五周 分治》求排列的逆序数 11

011:求排列的逆序数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它们之间的差异.考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一个排列含有逆序的个数称为这个排

HDU 4911 (树状数组+逆序数)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak<ak+1,那么交换后逆序对数+1,反之-1. 设原始序列最小逆序对数=cnt 那么,交换K次的最小逆序对数max(0,cnt-k) 在求原始序列最小逆序对数上,朴素暴力复杂度O(n^2)不可取 有以下两种O(nlogn)的方法: ①排序内计算: 主要是利用归并排序内的特性,即相邻两个归并序列逆序情

hdu2838Cow Sorting(树状数组+逆序数)

题目链接:点击打开链接 题意描述:给定一个长度为100000的数组,每个元素范围在1~100000,且互不相同,交换其中的任意两个数需要花费的代价为两个数之和.问如何交换使数组有序,花费的代价最小? 解题思路: 1.显然我们知道,要使一个数组有序至少交换的次数(即必须要交换的次数)为数组中的逆序数 2.由于数组的长度比较大所以我们可以通过树状数组来统计结果 此处需要两个树状数组 第一个:记录小于等于某个值的元素的个数 第二个:记录小于等于某个值的元素的和 代码: #include <cstdio

树状数组+逆序数与顺序数——HDU 2492

对应HDU题目:点击打开链接 Ping pong Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description N(3N20000) ping pong players live along a west-east street(consider the street as a line segment). Each player has a unique skil

求排列的逆序数之树状数组

代码实现 #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int num[100001]; int n,a[100001]; long long count=0; void add(int x){ for(int i=x;i<=n;i+=(i&-i))num[i]++; } void query(int p){ for(int i=p; i; i -= (

求排列的逆序数(9018_1679)

为了做noip2013的火柴排序,特地练了一下逆序对的求法. 逆序对的求法,若要nlogn,有2种,一种就是用归并排序的思想.另一种,就是线段树或者树状数组. 这里,我采用了第一种. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; inline int read(){ int t=1,num=0;char c=getc

POJ3067 树状数组+逆序数

设两线段为(x1,y1) ,(x2,y2), 若使两线段相交,需使x1<x2&&y1>y2||x1>x2&&y1<y2. 那么本题就变得很简单了,对东边点x从小到大排序,当x相等时对西边点y从小到大排序,每插入一条线段,就求一下逆序对数.总和即为答案. 代码如下: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #define