摩斯电码

摩斯电码_第1张图片
摩斯电码_第2张图片
摩斯电码_第3张图片
摩斯电码_第4张图片

#include
using namespace std;
const int mod=1000000007;
char NO[6][8];
char S[1000005];
int f[1000005],bj1[1000005],bj2[1000005],bj,ls;
int main(){
 NO[1][1]='0';
 NO[1][2]='0';
 NO[1][3]='1';
 NO[1][4]='1';
 NO[2][1]='0';
 NO[2][2]='1';
 NO[2][3]='0';
 NO[2][4]='1';
 NO[3][1]='1';
 NO[3][2]='1';
 NO[3][3]='1';
 NO[3][4]='0';
 NO[4][1]='1';
 NO[4][2]='1';
 NO[4][3]='1';
 NO[4][4]='1';
 NO[5][1]='1';
 NO[5][2]='1';
 NO[5][3]='0';
 NO[5][4]='0';
 NO[5][5]='0';
 NO[5][6]='1';
 NO[5][7]='0';
 scanf("%s",S+1);
 ls=strlen(S+1);
 for(int i=1;i<=ls;i++)
 {
  if(i>=4)
   for(int j=1;j<=4;j++)
   {
    bj=1;
    for(int k=i-4+1;k<=i;k++)
    { 
     if(NO[j][k-i+4]!=S[k])
     {
      bj=0;
      break;
     }
    } 
    if(bj)
    {
     bj1[i]=1;
     break;
    }
   }
  if(i>=7)
  {
   bj=1;
   for(int k=i-7+1;k<=i;k++)
   { 
    if(NO[5][k-i+7]!=S[k])
    {
     bj=0;
     break;
    }
   } 
   if(bj)
    bj2[i]=1;
  }
 }
 f[0]=1;
 for(int i=1;i<=ls;i++)
 {
  if(i>=1)
   f[i]=(f[i]+f[i-1])%mod;
  if(i>=2)
   f[i]=(f[i]+f[i-2])%mod;
  if(i>=3&&bj2[i]==0)
   f[i]=(f[i]+f[i-3])%mod;
  if(i>=3&&bj2[i]==1)
   f[i]=((f[i]+f[i-3]-f[i-7])%mod+mod)%mod;
  if(i>=4&&bj1[i]==0)
   f[i]=(f[i]+f[i-4])%mod;
 }
 cout<<f[ls]<<endl;
 return 0;
}

来源:zr

你可能感兴趣的:(zr,A)