POJ1496 Word Index【全排列】

题目链接:

http://poj.org/problem?id=1496

题目大意:

和给你一个字符串str,输出str在字典序全排列中的位置(从小到大排列)。

解题思路:

和 POJ1850 一模一样。

参考博文:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122771.html先判断str是不是升序序列,如果是升序序列,则为字典序的第1个,输出1。

不符合第一步的话,则分为两步计算str的字典序位置。

先计算比 str 的长度少的字符串总个数。

再计算长度和 str 一样,比 str 字典序的字符串的个数。

先来看第一步:

长度为 1 的字符串个数为 C(26,1)。

长度为 2 的字符串个数为 C(26,2)。

……

长度为 2 的字符串个数为 C(26,2)。

再来看第二步:

对于 str 的每一位 str[i] 和左边相邻的 str[i-1],如果str[i] > str[i-1],说明当前位置str[i] 至少

比前一位的 str[i-1] 大。

答案 ans 要加上用比 str[i]大的字母构成长度为 len-1-i 的字符串个数,即 C[26-ch][len-1-i]。

ch 从 str[i] 到 str[i-1] + 1。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int C[27][27];
void ZuHe()
{
    C[0][0] = C[1][0] = C[1][1] = 1;
    for(int i = 2; i <= 26; ++i)
    {
        C[i][0] = C[i][i] = 1;
        for(int j = 1; j < i; ++j)
            C[i][j] = C[i-1][j] + C[i-1][j-1];
    }
}

char str[20];

int main()
{
    ZuHe();
    while(~scanf("%s",str))
    {
        int ans = 0;

        int len = strlen(str);
        bool falg = true;
        for(int i = 1; i < len; ++i)
        {
            if(str[i] <= str[i-1])
            {
                falg = false;
                break;
            }
        }
        if( !falg )
        {
            printf("0\n");
            continue;
        }

        int Time = len-1;
        while(Time)
        {
            ans += C[26][Time];
            Time--;
        }

        int ch,ch1;
        for(int i = 0; i < len; ++i)
        {
            ch = str[i] - 'a';
            if(i == 0)
                ch1 = 0;
            else
                ch1 = str[i-1] - 'a' + 1;
            while(ch > ch1)
            {
                ans += C[26-ch][len-1-i];
                ch--;
            }
        }
        ans++;
        printf("%d\n",ans);
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 07:18:27

POJ1496 Word Index【全排列】的相关文章

poj1496 Word Index / poj1850 Code(组合数学)

poj1850 Code 题意:输出若干个给定的字符串($length<=10$)在字典序中的位置,字符串中的字母必须严格递增. 读取到非法字符串时,输出“0”,终止程序.(poj1496:继续读取) 我们分成2种情况讨论字典序小于给定字符串的字符串个数 1.长度比给定字符串小 其实长度为$i$的字符串的个数就是$C(26,i)$ 因为我们随机选取$i$个字符后,从小到大依次取出,是可以保证字符串是有序的. 2.长度等于给定字符串 我们枚举每一位,计算从该位开始小于给定字符串的个数,同样可以用组

uva 417 - Word Index(数位dp)

题目连接:uva 417 - Word Index 题目大意:按照题目中的要求,为字符串编号,现在给出字符串,问说编号为多少,注意字符串必须为递增的,否则编号为0. 解题思路:其实就是算说比给定字符串小并且满足递增的串由多少个.dp[i][j]表示第i个位为j满足比给定字符串小并且满足递增的串. dp[i][j]=∑k=0j?1dp[i?1][k]. 注意每次要处理边界的情况,并且最后要加上自身串.并且在处理边界的时候dp[i][0]要被赋值为1,代表前i个为空的情况. #include <cs

UVA 417 - Word Index(数论)

题意:417 - Word Index 题意:每个字符串按题目中那样去映射成一个数字,输入字符串,输出数字 思路:这题还是比较水的,由于一共只有83000多个数字,所以对应一个个数字去映射就可以了,注意字符串进位的情况处理即可 代码: #include <stdio.h> #include <string.h> #include <map> #include <string> using namespace std; char str[10]; map<

HDU Word Index (数位DP)

题意:给你字符串,算出它的数值: a -> 1 b -> 2 . . z -> 26 ab -> 27 ac -> 28 . . az -> 51 bc -> 52 . . vwxyz -> 83681 字母要求递增. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #incl

zoj 1342 - Word Index

题目:有一个单词表a,..,z,ab,..,yz,...vwxyz,给你一个单词,输出对应的编号. 分析:dp,数学.利用递推统计计数即可知道位置. 状态:F(l,s)代表长度为l的起始为s的元素的个数: 阶段:长度 { 逆向向前拼 }: 转移:F(l,s)= sum(F(l-1,t)) { 其中,s < t }: 说明:应该可以用数学推出公式的(2011-09-19 11:04). #include <stdio.h> #include <string.h> int Cou

specific word count (index of )

#region 统计文件中某一词语出现次数. while (true) { Console.WriteLine("请输入要查询的词语:"); string word = Console.ReadLine(); string[] novelArr = File.ReadAllLines("xiyou.txt", Encoding.Default); int count = 0;//计数变量 int index = 0;//每行的 初始索引 for (int i = 0

Word Search 和 Word Search Ⅱ

Word Search 和 Word Search Ⅱ Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighbo

[leetcode] Word Search

题目:(Backtrancing) Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter

LeetCode OJ:Add and Search Word - Data structure design(增加以及搜索单词)

Design a data structure that supports the following two operations: void addWord(word) bool search(word) search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter