【noip模拟赛3】编码

描述

 

AliceBob之间要进行秘密通信,他们正在讨论如何对信息进行加密:

Alice不如采用一种很简单的加密方式:’A’替换成1’B’替换成2„„,’Z’替换成26

Bob这种加密方式太傻了,Alice。如果我想要传送一个单词’BEAN’给你,它加密后就是25114。但你有很多种不同的方法来解密,从而得到许多单词!

Alice你说的是没错,但是除了’BEAN’有意义以外,其他解密出来的’BEAAD’

’YAAD’’YAN’’YKD’’BEKD’都没有任何含义。

Bob是的,但是同一个加密后的数字序列,可能的得到数以亿计的不同解密方案。

Alice是吗?有这么多吗?

你要帮助Bob编写一个程序,来说服Alice。对于一个加密后的数字序列,告诉她确切的解密方案数。

输入

 

有若干个加密后的数字序列,每行一个,行数不超过10,每行的数字数量不超过10000个。序列一定是符合要求的,例如没有先导的零和连续两个零等情况。数字间没有空格。一行一个零表示输入结束,这是不需要处理的。

输出

 

对于每个加密后的数字序列,输出一行。一个整数,表示解密的不同方案数。结果保证在32-bit带符号整数(longint)范围内。

输入样例 1 

25114 
1111111111 
3333333333 
0 

输出样例 1

6 
89 
1


很容易想到用dp做 但是我忽略了0 打好了交上去也全是wa。。
只要在原dp加上!=0即可
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
//input
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s)
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define N 10000+5
char a[N];
int dp[N];
int main()
{
    while(RS(a+1),a[1]-'0')
    {
        CLR(dp,0);
        dp[0]=dp[1]=1;
        for(int i=2;a[i];i++)
        {
            if(a[i]-'0'!=0)
                dp[i]=dp[i-1];

            if( (a[i-1]-'0')*10+a[i]-'0'<=26&&a[i-1]-'0'!=0 )
                dp[i]+=dp[i-2];
        }
        printf("%d
",dp[strlen(a+1)]);
    }
}











原文地址:https://www.cnblogs.com/bxd123/p/10500342.html