POJ 1850 Code

//这题和上题没什么区别
// 就是数据大了点而已
// 直接参考上题 http://www.cnblogs.com/372465774y/p/3604095.html
#include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define LL long long LL C[40][40]; int dp[40]; void init() { int i,j; for(i=0;i<=30;i++) C[i][0]=1; for(i=1;i<=30;i++) for(j=1;j<=i;j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; } char str[10]; int h[30]; LL fun(int ln,int index) { int i=1,j=1; LL sum=0; char c=str[index]; int lf=26; if(index>0) { index--; lf='z'-str[index]; i=str[index]-'a'+1; } for(;i<=26;i++) if(!h[i]) { if(c==(i-1+'a')) break; else { sum=sum+ C[lf-j][ln-1]; j++; } } return sum; } int main() { init(); int i,j; while(scanf("%s",str)!=EOF) { memset(h,0,sizeof(h)); int len=strlen(str); int flag=0; LL ans=0; for(i=1;i<len;i++) ans+=C[26][i]; for(i=0;i<len;i++) for(j=i+1;j<len;j++) if(str[i]>=str[j]) flag=1; if(flag) printf("0 "); else { for(i=0;i<len;i++) { ans=ans+fun(len-i,i); h[str[i]-'a'+1]=1; // lf--; } printf("%lld ",ans+1); } } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/3604123.html