HDU 1379 DNA Sorting (水归并排序)

来源:互联网 发布:数据集市建模工具 编辑:程序博客网 时间:2024/06/07 23:18


原题链接:Here!

分析:使用归并排序查找逆序数然后设置一个游标从0开始扫,扫到输出就ok


/*Note:处理逆序数对问题使用归并排序的思想 */ #include<cstdio>#include<cstring>#include<algorithm>using namespace std;//#define testint cnt ;const int  inf=0x3f3f3f;char str[100+5][50+5];// n<=50 m<=100void marge_sort(int *A,int x,int y,int *T){// O(nlogn) 数据上限在4.5*10^6左右  if(y-x>1){int m=x+(y-x)/2;int p=x,q=m,i=x;marge_sort(A,x,m,T);marge_sort(A,m,y,T);while( p<m || q<y){if( q>=y || ( p<m && A[p]<=A[q] ))T[i++]=A[p++];elseT[i++]=A[q++],cnt+=m-p;}for(int i=x;i<y;i++)A[i]=T[i];}}int main(){int T,n,m;int A[100],t[100],Mark[100];#ifdef testfreopen("Hdu 1379 DNA Sorting.txt","r",stdin);#endifscanf("%d",&T);while(T--){memset(Mark,0,sizeof(Mark));memset(A,0,sizeof(A));memset(t,0,sizeof(t));scanf("%d%d",&n,&m);for(int i=0;i<m;i++){cnt=0;scanf("%s",&str[i]);for(int j=0;j<n;j++){// 将字符型转化为整型 if(str[i][j]=='A')A[j]=1;else if(str[i][j]=='C')A[j]=2;else if(str[i][j]=='G')A[j]=3;else if(str[i][j]=='T')A[j]=4;}marge_sort(A,0,n,t);// O(nlogn) Mark[i]=cnt;}for(int i=0;i<inf;i++){// 输出注意一下就ok,设定个标尺从下向上扫,虽然是m*inf.. 好在数据小 for(int j=0;j<m;j++){if(Mark[j]==i)printf("%s\n",str[j]);}}}return 0;}



0 0