zoukankan      html  css  js  c++  java
  • csu 1563 Lexicography

    题意:给出一堆字母 问这些字母组成的字符串中第k大的

    排列组合,具体看代码

    //寒假集训被何柱大大踩好惨(>_<)

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #include<queue>
     8 #include<vector>
     9 #include<map>
    10 #include<stack>
    11 #include<string>
    12 
    13 using namespace std;
    14 int n;
    15 char s[20];
    16 char ans[20];int cnt[26];int f[17];
    17 
    18 int main(){
    19     f[0]=1;
    20     for (int i=1;i<=16;i++) f[i]=f[i-1]*i;
    21     while (1){
    22             scanf("%s%lld",s,&n);
    23             if (n==0 && s[0]=='#') return 0;
    24             int len=strlen(s);
    25             memset(cnt,0,sizeof(cnt));
    26             for (int i=0;i<len;i++){
    27                     cnt[s[i]-'A']++;
    28             }
    29             for (int i=0;i<len;i++){
    30                     int now=0;
    31                     int tmp=0;
    32                     for (int j=0;j<26;j++){//计算当前位 即把第i个字母放在首位时能产生多少种组合 
    33                             if (cnt[j]!=0){
    34                                     tmp=f[len-i-1];
    35                                     for (int k=0;k<26;k++){
    36                                             if (j==k)
    37                                                 tmp=tmp/f[cnt[k]-1];//去除重复的排列 如果已经有一个放在了当前位 cnt要-1 
    38                                             else
    39                                                 tmp=tmp/f[cnt[k]];
    40                                     }
    41                                     if (now+tmp>=n){//如果超出 就把第j个放在当前位 退出 
    42                                             cnt[j]-=1;
    43                                             n-=now;
    44                                             ans[i]=j+'A';
    45                                             break;
    46                                     }
    47                                     now=now+tmp;//累加 
    48                             }
    49                     }
    50             }
    51             for (int i=0;i<len;i++) printf("%c",ans[i]);
    52             printf("
    ");
    53     }
    54     return 0;
    55 }
    56 /*
    57 ACM 5
    58 ICPC 12
    59 REGION 274
    60 # 0
    61 */
  • 相关阅读:
    页面使用本地IE版本
    C#获取客户端ip
    获取存储过程返回数据
    自制js表格排序
    读取数据用rs.open sql,conn,1,1
    学习存储过程
    COLLATE Chinese_PRC_CI_AS
    sqlserver存储过程语句(转)
    用P3P header解决iframe跨域访问cookie(转载)
    java通过dom创建和解析xml
  • 原文地址:https://www.cnblogs.com/baby-mouse/p/4296292.html
Copyright © 2011-2022 走看看