摩斯电码

112 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值