zoukankan      html  css  js  c++  java
  • [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('
    ');
                   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('
    ');
                   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("
    ");
                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("
    ");
                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
    C");
                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("
    ");
                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("
    ");
                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
    ");
                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("
    C");
                    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
    ");
                    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
    C");
                    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
    ");
                    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
    C");
                    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
    ");
                    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
    C");
                    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
    ");
                    return 0;
                }
            }
        }
        printf("Happy new year!
    ");
        return 0;
    }
    

    太强辣

  • 相关阅读:
    编写 iPhone Friendly 的 Web 应用程序
    WebService的安全性讨论【身份识别】
    使用InstallShield系统变量的缺省值
    数据库用户操作相关
    TFS2010安装
    微软实验虚拟机下载地址
    生成18位不重复的ID
    Linux 账户 帐户管理 文件权限 权限管理
    Chrome 插件开发
    Ubuntu 环境变量 设置
  • 原文地址:https://www.cnblogs.com/stepsys/p/10383485.html
Copyright © 2011-2022 走看看