【codeforces 379D】New Year Letter

本文介绍了一道构造特定字符串的问题,通过枚举不同条件并递归计算,确保最终字符串包含指定数量的“AC”子串。适用于算法竞赛及字符串处理的学习。

【题目链接】:http://codeforces.com/contest/379/problem/D

【题意】

让你构造出两个长度分别为n和m的字符串s[1]和s[2]
然后按照连接的规则,顺序连接s[n-2]和s[n-1]得到s[n]
(n>=3)
即s[n] = s[n-2]+s[n-1]
以此规则得到s[k];
要求s[k]恰好出现x个“AC”子串;

【题解】

暴力题;
枚举s1有ac1个”AC”子串,s2有ac2个”AC”子串;
这里只有字符串的尾部为A且下一个字符串的头部为C才能富裕出一个“AC”子串;
则我们再枚举两个字符串的头尾;
即头部要不要加一个’C’以及尾部要不要加一个’A’;
看看符不符合长度要求;
符合长度要求;
就根据ac个数,以及两个字符串的头尾,递推到s[k];
得到s[k]的ac个数;
是x的话就输出结果;
(空出来的部分用’X’填就好)

【Number Of WA

1

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110;

LL k,x,n,m;

LL check2(int now,LL ac1,LL ac2,int st1,int en1,int st2,int en2){
    if (ac2>x) return ac2;
    if (now==k) return ac2;
    return check2(now+1,ac2,ac1 + ac2 + ( (en1 && st2)?1:0),st2,en2,st1,en2);
}

bool check(LL ac1,LL ac2,int st1,int en1,int st2,int en2){
    if (ac1*2 + st1 + en1>n) return false;
    if (ac2*2 + st2 + en2>m) return false;
    if (check2(2,ac1,ac2,st1,en1,st2,en2)==x) return true;
    return false;
}

string create(int ac,int st,int en,int len){
    string s;
    s.resize(len);
    int l = 0;
    if (st) s[l++] = 'C';
    if (en) s[--len] = 'A';
    while (ac--){
        s[l++] = 'A';
        s[l++] = 'C';
    }
    while (l<len) s[l++] = 'X';
    return s;
}

int main(){
    //Open();
    Close();
    cin >> k >> x >> n >> m;
    rep1(ac1,0,n/2)
        rep1(ac2,0,m/2)
            rep1(i,0,15)
            if (check(ac1,ac2,(i&1)>0,(i&2)>0,(i&4)>0,(i&8)>0)){
                cout << create(ac1,(i&1)>0,(i&2)>0,n) << endl;
                cout << create(ac2,(i&4)>0,(i&8)>0,m) << endl;
                return 0;
            }
    cout <<"Happy new year!"<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626263.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值