NYOJ139 我排第几个(字符串的解码)

题目信息:http://acm.nyist.net/JudgeOnline/problem.php?pid=139


现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?

输入
第一行有一个整数n(0<n<=10000);

随后有n行,每行是一个排列;

输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
1
302715242
260726926

题目分析:

本题的家吗问题,在《算法入门经典》中有解答,对于每一个字符s,若在其后有k个字符小于s,则当前的序列的排序会增大k*f[12-i]

AC代码:

/**
 *给出一个字符串,仅由a~l组成,每个出现一次,求给出字符串的字典序大小
 *对于每一个字符s,若在其后有k个字符小于s,则当前的序列的排序会增大k*f[12-i]
 *其中f是每个数的阶乘,i为s的位置,因此只需模拟每一位进行比较即可。
 */
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
    long long f[15];
    f[1]=1;
    for(int i=2;i<=12;i++){
        f[i]=f[i-1]*i;
    }
    char s[15]; int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",s+1);
        long long sum=0;
        for(int i=1;i<=12;i++){
            int k=0;
            for(int j=i+1;j<=12;j++){
                if(s[i]>s[j]) k++;
            }
            sum+=f[12-i]*k;
        }
        printf("%lld\n",sum+1);
    }

	return 0;
}
        
时间: 2024-10-19 04:41:48

NYOJ139 我排第几个(字符串的解码)的相关文章

Python学习第三天之字符串编码解码,集合,文件,函数

1数据类型--集合 初始化 list = [ 1, 2,3,4,5 ] set1 = set ( list ) 集合的逻辑关系 求交集: set3 = set1.intersection(set2)  或者  set3 = set1 & set2 求并集:set1.union(set2)  或者 set1 | set2 求差集:set6 = set1.difference(set2)  或者  set6 = set1 - set2 set5 = set2.difference(set1) 或者

JAVA编码字符串和解码字符串

1.编码字符串 public static String encode(String s, String encodeType) { if (s == null || s.equals("")) { return ""; } if (encodeType == null || encodeType.equals("")) { return s; } try { return URLEncoder.encode(s, encodeType); }

Openjudge-计算概论(A)-字符串排序

描述 参考整数排序方法,设计一种为字符串排序的算法,将字符串从小到大输出 输入 第一行为测试数据组数t, 后面跟着t组数据.每组数据第一行是n,表示这组数据有n行字符串,接下来是要排序的n行字符串.每行字符串的字符个数不会大于200, n < 100. 输出 对于每组数据,输出排好序的字符串,每组输出后要多输出一个空行 样例输入 2 2 Hello World 4 I Love C Language! 样例输出 Hello World C I Language! Love思路:这题可以把它们全部

Openjudge-计算概论(A)-单词倒排

描述: 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔. 输入输入为一个字符串(字符串长度至多为100).输出输出为按要求排续后的字符串. 样例输入 I am a student 样例输出 student a am I思路:首先把字符串先反转,从前往后扫,遇到空格处理一下单词,要特别注意:最后一个单词不同于其他单词,要单独处理!代码如下(本代码来自我的老师:http://www.cnblogs.com/huashanqingzhu

(华为)按照指定规则对输入的字符串进行处理

问题详细描述:将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为'0'--'9'或者'A'--'F'或者'a'--'f',则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为'4',为0100b,则翻转后为0010b,也就是2.转换后的字符为'2': 如字符为'7',为0111b,则翻转后为1110b,也就是e.转换后的字符为大写

华为OJ:字符串合并处理

字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为‘4’,为0100b,则翻转后为0010b,也就是2.转换后的字符为‘2’: 如字符为‘7’,为0111b

华为训练题:初级——合并字符串

按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为‘4’,为0100b,则翻转后为0010b,也就是2.转换后的字符为‘2’: 如字符为‘7’,为0111b,则翻转后为11

字符串专题练习

1.字符串和整数互相转化 2.字符串移位及移位包含 3.字符串中出现频率最高的字符及出现次数 4.字符串中*的处理(利用快排思想) 5.字符串的删除和替换(删除字符a,复制字符b:把空格替换为“%20”:删除重复字符) 6.字符串翻转 7.字符串最长(连续)重复子串.最长不重复子串

c++字符串排序

第11题:在主函数中输入10个等长的字符串,用另一函数对它们排序.然后在主函数输出这10个已排好序的字符串. 用两种方法完成. 方法一:用二维数组做函数参数: 方法二:用指向一维数组的指针做函数参数. 方法一:二维数组: #include<iostream> #include<string.h> using namespace std; int main() { char str[10][20]; cout<<"input 10 strings in the