1. 程式人生 > >【noip模擬賽3】編碼

【noip模擬賽3】編碼

。。 data- fin bit include long 不同的 sizeof 討論

描述

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\n",dp[strlen(a+1)]); } }












【noip模擬賽3】編碼