首页 > 其他分享 >做题记录 // 230217

做题记录 // 230217

时间:2023-02-18 17:14:30浏览次数:58  
标签:return 230217 记录 int vis maxn const 字典

T4 是什么,我不想做!我开摆了!

A. Substring

http://222.180.160.110:1024/contest/3312/problem/1

没记错的话这应该是一场 ABC 的 T1,总之我们想办法让 T 去匹配 S,也就是说,在 S 中枚举匹配起点,统计从匹配起点开始与 T 不同的字符总数,将所有起点的答案取 min 就行了。

namespace XSC062 {
const int maxn = 1e3 + 5;
const int inf = 0x3f3f3f3f;
int n, m, res;
char s[maxn], t[maxn];
inline int min(int x, int y) {
    return x < y ? x : y;
}
int main() {
    scanf("%s %s", s + 1, t + 1);
    n = strlen(s + 1);
    m = strlen(t + 1);
    res = inf;
    for (int i = 1; i <= n - m + 1; ++i) {
        int cnt = 0;
        for (int j = 1; j <= m; ++j)
            cnt += (s[i + j - 1] != t[j]);
        res = min(res, cnt);
    }
    printf("%d", res);
    return 0;
}
} // namespace XSC062

B. 字符串的展开

http://222.180.160.110:1024/contest/3312/problem/2

题目名字好熟悉!我总觉得我在不知道几年前写过 这样一篇题解。当时的文风和码风可谓不堪入目。

不难发现只需要对减号的两端特殊处理,所以我们走一遍整个字符串,遇到减号就看看它两边的东西,然后对应模拟就行了。

namespace XSC062 {
const int maxn = 105;
char s[maxn];
int p1, p2, p3, n;
inline bool isNum(char t) {
    return t >= '0' && t <= '9';
}
inline bool isLet(char t) {
    return t >= 'a' && t <= 'z';
}
inline void putNum(char l, char r) {
    if (p3 == 1) {
        for (int i = l + 1; i < r; ++i) {
            for (int j = 1; j <= p2; ++j)
                putchar(p1 == 3 ? '*' : i);
        }
    }
    else {
        for (int i = r - 1; i > l; --i) {
            for (int j = 1; j <= p2; ++j)
                putchar(p1 == 3 ? '*' : i);
        }
    }
    return;
}
inline void putLet(char l, char r) {
    if (p3 == 1) {
        for (int i = l + 1; i < r; ++i) {
            for (int j = 1; j <= p2; ++j) {
                if (p1 == 3)
                    putchar('*');
                else if (p1 == 1)
                    putchar(i);
                else putchar(i + 'A' - 'a');
            }
        }
    }
    else {
        for (int i = r - 1; i > l; --i) {
            for (int j = 1; j <= p2; ++j) {
                if (p1 == 3)
                    putchar('*');
                else if (p1 == 1)
                    putchar(i);
                else putchar(i + 'A' - 'a');
            }
        }
    }
    return;
}
inline void deal(char l, char r) {
    if (isNum(l) && isNum(r) && l < r)
        putNum(l, r);
    else if (isLet(l) && isLet(r) && l < r)
        putLet(l, r);
    else putchar('-');
    return;
}
int main() {
    scanf("%d %d %d", &p1, &p2, &p3);
    scanf("%s", s + 1);
    n = strlen(s + 1);
    for (int i = 1; i <= n; ++i) {
        if (s[i] == '-' && i >= 2 && i <= n - 1)
            deal(s[i - 1], s[i + 1]);
        else putchar(s[i]);
    }
    return 0;
}
} // namespace XSC062

C. 1-05E. mm逗黑白猫

http://222.180.160.110:1024/contest/3312/problem/3

听 gm 说这道题 A*,双向广搜,朴素广搜都有人过的,总之我写的是双向广搜。

字典序最小这个点确实难了我很久,对于正向,我们只需要保证按照字典序从小往大搜就可以了,因为靠前的部分字典序越小,整体的字典序就越小。

但对于反向就有点麻烦,好像最终从前往后的输出字典序大小并不能由反向搜索顺序决定……

所以我们暴力一点,对于同一层内的反向搜索,我们让最后一次(也就是最靠前)交换字典序最小的排在前面,用一个优先队列实现。这样我们就能保证碰头的时候能用字典序最小的反向碰到字典序最小的正向。

好悬啊,不知道能不能过啊,开摆啦!

namespace XSC062 {
const int inf = 0x3f3f3f3f;
const int maxm = (1 << 16) + 5;
struct _ {
    int s, t, d, p, fa;
    bool operator< (const _ &q) const {
        if (t != q.t)
            return t > q.t;
        else if (q.d != d)
            return d > q.d;
        else if (d == 0)
            return p > q.p;
        else
            return (s ^ fa) < (q.s ^ q.fa);
    }
};
_ b, e;
int x, now;
int vis[2][maxm];
std::priority_queue<_> q;
inline void print(int x) {
    for (int i = 15; ~i; --i) {
        if (x & (1 << i))
            printf("%d%d", 4 - (i / 4), 4 - (i % 4));
    }
    putchar('\n');
    return;
}
inline void TWBFS(_ &be, _ &en) {
    q.push(be), q.push(en);
    while (!q.empty()) {
        _ f = q.top(), t;
        t = f, ++t.t, t.fa = f.s;
        q.pop();
        if (vis[f.d][f.s] != inf)
            continue;
        vis[f.d][f.s] = f.fa;
        for (int i = 15; ~i; --i) {
            for (int j = i - 1; ~j; --j) {
                int k = (f.s >> i) & 1;
                int l = (f.s >> j) & 1;
                t.s = f.s - (k << i) + (l << i)
                            - (l << j) + (k << j);
                if (vis[!t.d][t.s] != inf) {
                    int cnt = t.t, x = t.s;
                    while (~vis[!t.d][x])
                        ++cnt, x = vis[!t.d][x];
                    printf("%d\n", cnt);
                    x = t.s;
                    std::stack<int> s;
                    vis[t.d][t.s] = f.s;
                    while (~vis[t.d][x]) {
                        s.push(x);
                        x = vis[t.d][x];
                    }
                    while (!s.empty()) {
                        x = s.top(), s.pop();
                        print(x ^ vis[t.d][x]);
                    }
                    x = t.s;
                    while (~vis[!t.d][x]) {
                        print(x ^ vis[!t.d][x]);
                        x = vis[!t.d][x];
                    }
                    return;
                }
                if (vis[t.d][t.s] == inf) {
                    t.p = ++now;
                    q.push(t);
                }
            }
        }
    }
    return;
}
int main() {
    memset(vis, 0x3f, sizeof (vis));
    for (int i = 1; i <= 4; ++i) {
        for (int j = 1; j <= 4; ++j) {
            scanf("%1d", &x);
            b.s = (b.s << 1) + x;
        }
    }
    for (int i = 1; i <= 4; ++i) {
        for (int j = 1; j <= 4; ++j) {
            scanf("%1d", &x);
            e.s = (e.s << 1) + x;
        }
    }
    if (b.s == e.s) {
        puts("0");
        return 0;
    }
    e.d = 1, b.fa = e.fa = -1;
    TWBFS(b, e);
    return 0;
}
} // namespace XSC062

D. zzj & liaoy 想要去摄影

http://222.180.160.110:1024/contest/3312/problem/4

为啥看到 liaoy 这个名字会无端联想到嫂子…… 我不是很认识她,只知道她是一个开放的魁梧女子(试图把伊斯文化传播到 OI)。

这个怎么打啊,我只会爆搜啊,gm 还说这题比 T3 简单来着……

不对,我还是可以双向广搜!

标签:return,230217,记录,int,vis,maxn,const,字典
From: https://www.cnblogs.com/XSC062/p/17131423.html

相关文章

  • UEFI学习——windows 环境搭建记录
    环境搭建的过程安装开发工具:下载VS2019(编译C/C++)、python、IASL(MicrosoftACPI源语言(ASL)编译器、NASM编译器(x86汇编语言编译器),默认安装到系统盘就好;添加环境......
  • 【智能系统学报】投稿记录
    [1]时间线  2023-2-13投稿,状态为:正在初审;  2023-2-15晚上通过初审,状态为:等待责编处理;  2023-2-16上午提交审稿费,状态为:等待责编处理;  2023-2-16晚上收到汇款......
  • sqlite把多条记录合并成字符串,用逗号分隔
    selectgroup_concat(hdcd_DeptName)fromf1wherehdcd_DeptName='呼吸内科门诊' 我们需要把多条记录合并成字符串,用逗号分隔。这样的需求,目的是用于SQL语句和JS......
  • wsl2 安装arch+i3wm记录随笔
    基础安装请参考这篇博客https://gitee.com/regentsai/wsl_arch_kde安装基础软件sudopacman-Svimnet-toolsi3alacrittyfish安装i3安装之前先安装xorg-serversu......
  • 记录一次内网环境配置
    前言因为近期有需要,在内网进行轻量编程办公,期间遇到一点问题和自己做的步骤记录下来,便于后期回顾。安装编译器VSCode编译器首选的还是VScodehttps://code.visualstudi......
  • P6371做题记录+鲜花 复杂度
    看到很大的范围限制,很容易想到数位dp,记录当前\(mod\X\)的值。但是\(X\)会非常大,复杂度爆炸。考虑不用数位dp怎么做。容易想到直接枚举\(X\)倍数然后判断是不是......
  • python项目中的“填坑”记录
    基础Python是动态类型的语言,Python中任何事物皆对象,如变量、数据结构、函数、类、模块等等,在创建一个对象的时候就会占用内存,Python中对象和引用是分离。Python的内存管理......
  • 20230217周报
    本周时间管理回顾时间管理记录本周手机使用时间理论上应该是变少了的,因为感觉工作效率还可以。但是实际一看,微信使用时长也快到了一个小时,非常莫名其妙。还是要减少看微......
  • docker学习记录
    系统环境NAME="Ubuntu"VERSION="18.04.2LTS(BionicBeaver)"感受惊为天人,这玩意真的好用在我目前来看,docker就是一个轻量化的虚拟机,用多了vmware,用这样迅捷的虚拟......
  • 记录一个有意思c++现象
      即使类没有带参初始化函数依然可以给对象数组赋值,而且有多个成员时是每个对象每个成员逐个赋值的。====================  也可以这样两层赋值。============......