Codeforces Round #597 (Div. 2) C. Constanze's Machine (dp)

https://codeforces.com/problemset/problem/1245/C

Akko对机器进行了修修补补,这样如果你发‘w’音,它会把‘w’写成‘uu’,如果你发‘m’音,它会把‘nn’写成‘m’!

其余字母的行为和以前一样:如果你发出除了“w”和“m”之外的任何一个字母,机器就会把它写在一张纸上。

第二天,我的邮箱里收到了一封信。我不能理解它,所以我认为它要么只是Akko的一些胡言乱语,要么是Constanze用她的机器做的。但是因为我知道Akko做了什么,我可以列出所有可能的字符串,Constanze的机器会把它们转换成我得到的信息,看看是否有什么有意义的。

但是我需要知道我需要多少纸,这就是我向你求助的原因。告诉我康斯坦茨的机器会把多少字符串转换成我收到的信息。

但是因为这个数可能很大,告诉我它除以10^9+7的余数。

如果Constanze的机器没有将字符串转换成我得到的消息,那么打印0。

Examples
input
ouuokarinn
output
4

input
banana
output
1

input
nnn
output
3

input
amanda
output
0

这个题目的意思有一点难理解,他的意思就是我给定一个字符串,如果我本来有某些字符想打出‘w’或者‘m’来的,却被恶搞打成了‘uu’或者‘nn’,这就是可能被恶搞了的;
但是如果你发现该打出的‘w’或者‘m’都可以打出来,说明这个机子是好的,那肯定是没用动过手脚的,eg4表示这样的情况就可以输出0;
让我们数一下原先可能的字符串形式有多少种?
每次得到的一个区间内的‘n’以及‘u’都可以用斐波那契推出总数,总数就是全部×起来
tle版本(思路清晰,辅助理解)

//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cstdio>
#include<map>
#include<vector>
#include<set>
#include<queue>
#include<deque>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=1e5+10;
const int M=2002;
const int mod=1e9+7;
int a[N],b[N];
bool vis[N],st[N];
int dx[]={-1,0,0,1,-1,-1,1,1},dy[]={0,1,-1,0,1,-1,-1,1};
LL f(LL x)
{
    if(x<=3) return x;
    else return (f(x-1)%mod+f(x-2)%mod)%mod;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        string s;
        cin>>s;
        if(count(s.begin(),s.end(),'w')!=0||count(s.begin(),s.end(),'m')!=0)
        {
            cout<<"0"<<endl;
            break;
        }
        LL nn=0,uu=0;
        LL sum=0;
        vector<LL> v;
        for(LL i=0;i<s.size();i++)
        {
            if(s[i]=='n')
            {
                nn++;
                while(s[i+1]=='n')
                {
                    i++;
                    nn++;
                }
                sum=f(nn)%mod;
                v.push_back(sum);
                nn=0;
            }
            else if(s[i]=='u')
            {
                uu++;
                while(s[i+1]=='u')
                {
                    i++;
                    uu++;
                }
                sum=f(uu)%mod;
                v.push_back(sum);
                uu=0;
            }
        }
        if(v.size()==0)
        {
            cout<<"1"<<endl;
            break;
        }
        LL res=0;
        for(LL i=0;i<v.size();i++)
        {
            //cout<<v[i]<<" ";
            if(i==0) res=v[i]%mod;
            else res*=v[i]%mod;
        }
        cout<<res%mod<<endl;
    }
    return 0;
}

不知道是哪个地方取模出了问题,没有模好,导致TLE

正解

//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cstdio>
#include<map>
#include<vector>
#include<set>
#include<queue>
#include<deque>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=1e5+10;
const int M=2002;
const int mod=1e9+7;
LL a[N],b[N],f[N];
bool vis[N],st[N];
int dx[]={-1,0,0,1,-1,-1,1,1},dy[]={0,1,-1,0,1,-1,-1,1};
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        string s;
        cin>>s;
        if(count(s.begin(),s.end(),'w')!=0||count(s.begin(),s.end(),'m')!=0)
        {
            cout<<"0"<<endl;
            break;
        }
        f[0]=1;
        f[1]=1;
        for(LL i=2;i<=s.size();i++)
        {
            f[i]=f[i-1];
            if((s[i-1]=='u'||s[i-1]=='n')&&(s[i-1]==s[i-2]))
            {
                f[i]=(f[i-1]+f[i-2])%mod;
            }
        }
        cout<<f[s.size()]<<endl;
    }
    return 0;
}
posted @ 2022-07-29 17:17  高尔赛凡尔娟  阅读(46)  评论(0编辑  收藏  举报