题面
给你一个字符串,其中两个 u u u是可以变成 w w w,两个 n n n是可以变成 m m m,当然也可以不会,问有可能有多少的字符串。
解题方法
首先我们要先判断一下 m 和 w m\text{和}w m和w是否出现过,如果出现过那么就直接输出 0 0 0结束,如果不是我们就开始 d p dp dp,我们发现如果这两个字符可以合并,那么 d p [ i ] = d [ i − 1 ] + d [ i − 2 ] dp[i]=d[i-1]+d[i-2] dp[i]=d[i−1]+d[i−2],就解决了。
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
long long dp[200010];
const long long mod=1e9+7;
int main()
{
string s;
cin>>s;
int ans=0;
dp[0]=dp[1]=1;
if(s[0]=='w'||s[0]=='m')
{
puts("0");
return 0;
}
for(long long i=1;i<s.length();i++)
{
if(s[i]==s[i-1]&&(s[i]=='u'||s[i]=='n'))
dp[i+1]=(dp[i]+dp[i-1])%mod;
else dp[i+1]=dp[i];
if(s[i]=='w'||s[i]=='m')
{
puts("0");
return 0;
}
}
cout<<dp[s.length()]<<'\n';
return 0;
}