poj1496 字串編碼(排列組合)

來源:互聯網
上載者:User

        按照題目的編碼規則,給一個串輸出它對應的編號。排列組合的問題,算出當前串前面的串共有多少個,靜下心好好推推就好了。

#include <stdio.h>#include <string.h>int c[27][27];int cal(char* str){//vwxyzchar ch='a'-1;int i=0,j,k;while(str[i]){//字串是否嚴格升序,順便求長度if(str[i]<=ch){return 0;}ch=str[i];i++;}int len=i;int index=0;for(i=1;i<len;i++){//長度小於當前串長度的個數,比如對於串vwxyz,那麼此處就是c(26,1)+c(26,2)+c(26,3)+c(26,4)index+=c[26][i];}j=str[0]-'a';for(i=0;i<j;i++){//當前串第一個字母前有多少個,此處就是a-u開頭的len為5的串的數目index+=c[25-i][len-1];}i=1;//剩下的字母(只有第一位是比較特殊的,從第二位開始都一樣)while(i<len){//wxyzk=(int)(str[i]-'a');for(j=(int)(str[i-1]-'a')+1;j<k;j++){index+=c[25-j][len-1-i];}i++;}return index+1;}int main(void){int i;int j;for(i=0;i<27;i++){for(j=0;j<=i;j++){if(j==0||i==j){c[i][j]=1;}else{c[i][j]=c[i-1][j]+c[i-1][j-1];}}}char str[11];while(scanf("%s",str)!=EOF){printf("%d\n",cal(str));}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.