[CF379D](New Year Letter)

  • 题意

给你k,x,n,m
你需要构造两个长为n,m的串S1,S2

有一个构造方式\(s_n\)=\(s_{n-1}\)+\(s_{n-2}\)

即字符串列为

\(s_1\)

\(s_2\)

\(s_1\)+\(s_2\)

\(s_2\)+\(s_1\)+\(s_2\)

\(s_1\)+\(s_2\)+\(s_2\)+\(s_1\)+\(s_2\)

要求使得第k个串包含x个"AC";

  • solution

设初始串为a,b

串列为

a

b

ab

bab

abbab

bababbab

abbabbababbab

bababbababbabbababbab

观察到可以组成AC的方式有a,b,ab,ba,bb五种

列个表(串列中每一项中a,b,ab,ba,bb的数量)

index a b ab ba bb
1 1 0 0 0 0
2 0 1 0 0 0
3 1 1 1 0 0
4 1+0=1 1+1=2 1+0=1 0+0+(1)=1 0+0+(0)=0
5 1+1=2 1+2=3 1+1=2 1+0+(0)=1 0+0+(1)=1
6 1+2=3 2+3=5 1+2=3 1+1+(1)=3 1+0+(0)=1
7 2+3=5 3+5=8 2+3=5 1+3+(0)=4 1+1+(1)=3

规律自己去找

然后我们枚举两个串中AC子串的数量

枚举两个串的首尾字符

就可以AC辣

  • code

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
#define rep(a)  for(int a=0;a<2;a++)//0 在首位表示C,在末尾表示A,1则反之
using namespace std;
int F[105];
int dp[105];
int a,b,c,p1,p2,p3;
int k,x,n,m;
signed main(){
  scanf("%lld%lld%lld%lld",&k,&x,&n,&m);
  for(int i=0;i<=n/2;i++)
  for(int r=0;r<=m/2;r++)
    rep(a)
      rep(b)
        rep(c)
          rep(d){
             if(i*2+a+b>n||r*2+c+d>m)continue;
             int cc=(b&&c),dd=(a&&d),ee=(d&&c);
             dp[1]=i,dp[2]=r,dp[3]=i+r+cc;
             for(int p=4;p<=k;p++){// 大力七维枚举
                dp[p]=dp[p-2]+dp[p-1];
                if((p%2==0)){if(dd)dp[p]++;}
                else if(ee)dp[p]++;
                }
             if(dp[k]==x){
               if(a==1)putchar('C');
               for(int p=1;p<=i;p++)putchar('A'),putchar('C');
               for(int p=i*2+a+1;p<=n-b;p++)putchar('X');
               if(b)putchar('A');
               putchar('\n');
               if(c)putchar('C');
               for(int p=1;p<=r;p++)putchar('A'),putchar('C');
               for(int p=r*2+c+1;p<=m-d;p++)putchar('X');
               if(d)putchar('A');
               putchar('\n');
               return 0;
               }
             }
  puts("Happy new year!");
  }


如果你是从这里过来的,
请欣赏syk大佬的神仙代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int l[500005],r[500005],t[7][500005];
signed main()
{
    int k,x,n,m;
    scanf("%lld%lld%lld%lld",&k,&x,&n,&m);
    l[1]=r[1]=1;
    l[2]=r[2]=2;
    t[3][1]=1;
    t[4][2]=1;
    for(int i=3;i<=k;i++)
    {
        t[1][i]=t[1][i-1]+t[1][i-2];//12
        t[2][i]=t[2][i-1]+t[2][i-2];//21
        t[3][i]=t[3][i-1]+t[3][i-2];//111
        t[4][i]=t[4][i-1]+t[4][i-2];//12
        t[5][i]=t[5][i-1]+t[5][i-2];//12
        if(r[i-2]==1&&l[i-1]==2) t[1][i]++;
        if(r[i-2]==2&&l[i-1]==1) t[2][i]++;
        if(r[i-2]==2&&l[i-1]==2) t[5][i]++;
        r[i]=r[i-1];
        l[i]=l[i-2];
    }
    int xx=x;
    for(int i=0;i<=n/2;i++)
    {
        int xxx=xx-t[3][k]*i;
        if(xxx<0) break;
        if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
        {
            for(int j=1;j<=i;j++)
            {
                printf("AC");
            }
            for(int j=i*2+1;j<=n;j++)
            {
                printf("B");
            }
            printf("\n");
            for(int j=1;j<=xxx/t[4][k];j++)
            {
                printf("AC");
            }
            for(int j=xxx/t[4][k]*2+1;j<=m;j++)
            {
                printf("B");
            }
            printf("\n");
            return 0;
        }
    }
    n--,m--;
    xx=x-t[1][k];
    for(int i=0;i<=n/2;i++)
    {
        int xxx=xx-t[3][k]*i;
        if(xxx<0) break;
        if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
        {
            for(int j=1;j<=i;j++)
            {
                printf("AC");
            }
            for(int j=i*2+1;j<=n;j++)
            {
                printf("B");
            }
            printf("A\nC");
            for(int j=1;j<=xxx/t[4][k];j++)
            {
                printf("AC");
            }
            for(int j=xxx/t[4][k]*2+1;j<=m;j++)
            {
                printf("B");
            }
            printf("\n");
            return 0;
        }
    }
    xx=x-t[2][k];
    for(int i=0;i<=n/2;i++)
    {
        int xxx=xx-t[3][k]*i;
        if(xxx<0) break;
        if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
        {
            printf("C");
            for(int j=1;j<=i;j++)
            {
                printf("AC");
            }
            for(int j=i*2+1;j<=n;j++)
            {
                printf("B");
            }
            printf("\n");
            for(int j=1;j<=xxx/t[4][k];j++)
            {
                printf("AC");
            }
            for(int j=xxx/t[4][k]*2+1;j<=m;j++)
            {
                printf("B");
            }
            printf("A\n");
            return 0;
        }
    }
    n++,m--;
    if(m>=0)
    {
        xx=x-t[5][k];
        for(int i=0;i<=n/2;i++)
        {
            int xxx=xx-t[3][k]*i;
            if(xxx<0) break;
            if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
            {
                for(int j=1;j<=i;j++)
                {
                    printf("AC");
                }
                for(int j=i*2+1;j<=n;j++)
                {
                    printf("B");
                }
                printf("\nC");
                for(int j=1;j<=xxx/t[4][k];j++)
                {
                    printf("AC");
                }
                for(int j=xxx/t[4][k]*2+1;j<=m;j++)
                {
                    printf("B");
                }
                printf("A\n");
                return 0;
            }
        }
    }
    n-=2;
    if(n>=0&&m>=0)
    {
        xx=x-t[1][k]-t[5][k];
        for(int i=0;i<=n/2;i++)
        {
            int xxx=xx-t[3][k]*i;
            if(xxx<0) break;
            if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
            {
                printf("B");
                for(int j=1;j<=i;j++)
                {
                    printf("AC");
                }
                for(int j=i*2+1;j<=n;j++)
                {
                    printf("B");
                }
                printf("A\nC");
                for(int j=1;j<=xxx/t[4][k];j++)
                {
                    printf("AC");
                }
                for(int j=xxx/t[4][k]*2+1;j<=m;j++)
                {
                    printf("B");
                }
                printf("A\n");
                return 0;
            }
        }
        xx=x-t[2][k]-t[5][k];
        for(int i=0;i<=n/2;i++)
        {
            int xxx=xx-t[3][k]*i;
            if(xxx<0) break;
            if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
            {
                printf("C");
                for(int j=1;j<=i;j++)
                {
                    printf("AC");
                }
                for(int j=i*2+1;j<=n;j++)
                {
                    printf("B");
                }
                printf("B\nC");
                for(int j=1;j<=xxx/t[4][k];j++)
                {
                    printf("AC");
                }
                for(int j=xxx/t[4][k]*2+1;j<=m;j++)
                {
                    printf("B");
                }
                printf("A\n");
                return 0;
            }
        }
        xx=x-t[1][k]-t[2][k]-t[5][k];
        for(int i=0;i<=n/2;i++)
        {
            int xxx=xx-t[3][k]*i;
            if(xxx<0) break;
            if(xxx%t[4][k]==0&&xxx/t[4][k]<=m/2)
            {
                printf("C");
                for(int j=1;j<=i;j++)
                {
                    printf("AC");
                }
                for(int j=i*2+1;j<=n;j++)
                {
                    printf("B");
                }
                printf("A\nC");
                for(int j=1;j<=xxx/t[4][k];j++)
                {
                    printf("AC");
                }
                for(int j=xxx/t[4][k]*2+1;j<=m;j++)
                {
                    printf("B");
                }
                printf("A\n");
                return 0;
            }
        }
    }
    printf("Happy new year!\n");
    return 0;
}

太强辣

posted @ 2019-02-15 14:26  stepsys  阅读(396)  评论(1编辑  收藏  举报

*/