摩斯电码

版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82845423

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

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
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

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/82845423
今日推荐