/*
zoj_1342 模拟
直接把以a.b.c....z开头的1-5位的word统计出来,再分别求出跟input一样长度并且次序比input前的word个数,
还有比input长度短的word个数。写的晕头转向。。。
队友直接暴力0ms过,坑爹的数据啊。。
*/
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <map>
using namespace std;
int num[5][26];//统计以a.b.c....z开头的1-5位的word
int total[5];
int count( int row,int sta,int end )
{
int j,sum;
sum=0;
for( j=sta;j<end;j++ )
sum+=num[row][j];
return sum;
}
bool check( string s )
{
int i;
for( i=1;i<s.size();i++ )
if( s[i]<=s[i-1] )
break;
if( i==s.size() ) return true;
else return false;
}
int main()
{
int i,j,k,sum;
string s;
memset( num,0,sizeof(num) );
memset( total,0,sizeof(total) );
for( i=0;i<26;i++ )
num[0][i]=1;
total[0]=26;
for( i=1;i<5;i++ )
{
for( j=0;j<26;j++ )
{
for( k=j+1;k<26;k++ )
num[i][j]+=num[i-1][k];
total[i]+=num[i][j];
}
}
for( i=1;i<5;i++ )
total[i]+=total[i-1];
while( cin>>s )
{
if( check(s) )
{
sum=0; //sum求的是跟s的长度相同的并且出现次序比s前的word个数
for( i=0;i<s.size();i++ )
{
if( i!=0 ) sum+=count( s.size()-i-1,s[i-1]-'a'+1,s[i]-'a' );
else sum+=count( s.size()-i-1,0,s[i]-'a' );
}
if( s.size()>=2 ) //total[s.size()-2]统计的是比s的长度小的word个数
cout<<sum+total[s.size()-2]+1<<endl;
else cout<<sum+1<<endl;
}
else cout<<"0"<<endl;
}
return 0;
}
zoj 1342
最新推荐文章于 2014-10-01 22:37:24 发布