Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 8710 | Accepted: 4141 |
Description
The coding system works like this:
• The words are arranged in the increasing order of their length.
• The words with the same length are arranged in lexicographical order (the order from the dictionary).
• We codify these words by their numbering, starting with a, as follows:
a - 1
b - 2
...
z - 26
ab - 27
...
az - 51
bc - 52
...
vwxyz - 83681
...
Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code.
Input
• The word is maximum 10 letters length
• The English alphabet has 26 characters.
Output
Sample Input
bf
Sample Output
55
題意是給了一個字符串,問其在給定字典中的位置,字符串本身要判斷是否符合字典排序。
真的很討厭做這種題目,感覺沒什麼分析,不會的話就怎麼想都是不會了。但這個題目還算比較簡單,找規律,要利用c[i][j]=c[i-1][j-1]+c[i-1][j];預處理出來比這個字符串長度少的所有數量,再從起始字符開始逐個找之前對應長度的字符串,數量都加起來就是答案。
代碼:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;
int c[33][33],len,i,sum;
char temp[50];
void init()
{
int i,j;
memset(c,0,sizeof(c));
for(i=0;i<=32;i++)
{
for(j=0;j<=i;j++)
{
if(j==0||j==i)
c[i][j]=1;
else
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
}
bool pend(string temp)
{
for(i=1;i<len;i++)
{
if(temp[i]<temp[i-1])
return false;
}
return true;
}
void dfs(int step)
{
if(step==len)
return;
}
int main()
{
while(scanf("%s",temp)!=EOF)
{
init();
sum=0;
len=strlen(temp);
if(pend(temp))
{
for(i=1;i<len;i++)
{
sum+=c[26][i];
}
for(i=0;i<len;i++)
{
char temp_c;
if(i!=len-1)
{
if(i==0)
temp_c='a';
else
temp_c=temp[i-1]+1;
for(;temp_c<temp[i];temp_c++)
{
sum += c[26-(temp_c-'a'+1)][len-(i+1)];
}
}
else
{
if(len==1)
sum+=temp[i]-'a'+1;
else
sum += temp[i]-temp[i-1];
}
}
cout<<sum<<endl;
}
else
{
cout<<0<<endl;
}
}
return 0;
}