记录编号 458878 评测结果 AAAAAAAAAA
题目名称 2684.[POJ 1850] 编码 最终得分 100
用户昵称 konnyaku 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2017-10-11 21:34:40 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
///
int st[27];
int n=0,th,formor;
long long int cod=0;
struct digit
{
	int e[28];
};
digit c[27];
int MAX=0;
bool abl=true;
///
void orts(int k)//k>=2
{
	for(int i=1;i<=26-k;i++)//  1 ~ 26-k+1
	{
		c[k].e[i]+=c[k].e[i-1];//26-(k-1)+1
		
		c[k].e[i+1]=c[k-1].e[28-k]-c[k-1].e[i+1]+1;
	}
	c[k].e[27-k]+=c[k].e[26-k];
	
	c[k+1].e[0]=c[k].e[27-k]+1;
	
	if(k<n)
		orts(k+1);
	else
		return;
}
int main()
{
	freopen("poj1850.in","r",stdin);
	freopen("poj1850.out","w",stdout);
	
	char x;
	while(cin>>x)
	{
		n++;
		st[n]=x-'a'+1;
		if(st[n]<=MAX)
			abl=false;
		else
			MAX=st[n];
	}
	
	if(abl)
	{
		for(int i=0;i<=n;i++)
			memset(c[i].e,0,sizeof(c[i].e));
		for(int i=1;i<=26;i++)
			c[1].e[i]=i;
		c[2].e[0]=27;//26+1
		
		orts(2);
		
		int r=0,N=n+1;
		cod+=c[n].e[ st[N-n] ];
		formor=st[N-n]+1;
		n--;
		while(n>0)
		{
			cod+=c[n].e[ st[N-n] ]-c[n].e[formor];
			formor=st[N-n]+1;
			n--;
		}
		cout<<cod;
	}
	else
		cout<<0;
	return 0;
}