AT_abc287_d [ABC287D] Match or Not 题解

文章介绍了如何设计一个程序,判断给定的两个字符串S和T,通过替换S的后|T|位中的?字符,使得组成的字符串P与T相等。通过遍历和计数不匹配字符来实现此过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给定两个字符串 S , T S,T S,T ,它们仅由小写字母和字符 ? 组成,其中 ? 部分代表该位置可以被替换成任意的小写字母。

请你设计程序,对于所有的 x = 0 , 1 , 2 , … , ∣ T ∣ x=0,1,2,\dots,|T| x=0,1,2,,T,判断是否存在满足以下要求的方案:

截取 S S S 的前 x x x 位与后 ∣ T ∣ − x |T|-x Tx 位组成新的字符串 P P P ,字符串 P P P T T T 相等。

思路

这道题我们可以先使用一个字符串 X X X 表示后 ∣ T ∣ |T| T 位的字符串,接着遍历 X X X T T T 看看是否符合,不符合的话我们就记录一下并且将 c n t cnt cnt 加一, c n t cnt cnt 表示当前字符串 X X X 与字符串 T T T 不相等的位的个数。如果 c n t cnt cnt 为零,则输出 Yes,否则输出 No

接着我们看一下下面这个样例:

atcoder
?????

我们的每一次组出来的应是:

coder
aoder
atder
atcer
atcor
atcod

不难发现,我们更改的第 i i i 次只是 X i X_i Xi。我们可以继续用回原本的 c n t cnt cnt,要是当前 X i X_i Xi 更改后与 T i T_i Ti 符合了并且原本是不符合的就讲 c n t cnt cnt 减一;要是当前 X i X_i Xi 更改后与 T i T_i Ti 不符合了并且原本是符合的就讲 c n t cnt cnt 加一。如果 c n t cnt cnt 为零,则输出 Yes,否则输出 No

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
string s, t, x;
int bj[300005], cnt;
signed main() {
    cin >> s >> t;
    x = s.substr(s.size() - t.size(), t.size());//截取后面|t|位
    for (int i = 0; i < x.size(); i++)
        if (x[i] != '?' && t[i] != '?' && x[i] != t[i])//符合
            bj[i] = 1, cnt++;//记录
    printf((cnt == 0) ? "Yes\n" : "No\n");//判断
    for (int i = 0; i < t.size(); i++) {
        x[i] = s[i];
        if (bj[i] == 1 && (x[i] == t[i] || x[i] == '?' || t[i] == '?'))
            cnt--;
        if (x[i] != t[i] && x[i] != '?' && t[i] != '?' && bj[i] == 0)
            cnt++;
        printf((cnt == 0) ? "Yes\n" : "No\n");//判断
    }
    return 0;
}
### 关于洛谷 AT_ABC219_C Neo-lexicographic Ordering 的解题思路 对于给定的新字母顺序字符串 \(X\) 和一系列单词列表,目标是在新定义的字典序下对这些单词进行排序。此问题的核心在于理解如何依据自定义的字符优先级来比较两个字符串。 #### 字符串比较逻辑 为了按照新的字母表顺序排列字符串数组,需先构建一个映射关系,该映射能够将原始英文字母转换为对应的新位置编号。这可以通过遍历输入的字符串 \(X\) 来完成,并记录每个字符的位置索引作为其权重值[^4]。 ```python def create_mapping(order_string): mapping = {} for index, char in enumerate(order_string): mapping[char] = index return mapping ``` 有了这个映射之后,在对比任意两个字符串时就可以逐位检查它们对应的数值大小来进行判断: ```python def compare_strings(s1, s2, map_): min_length = min(len(s1), len(s2)) for i in range(min_length): if map_[s1[i]] != map_[s2[i]]: return -1 if map_[s1[i]] < map_[s2[i]] else 1 # If all characters are equal up to the length of shorter one, # then longer string should come after. if len(s1) == len(s2): return 0 elif len(s1) < len(s2): return -1 else: return 1 ``` 最后一步就是应用上述函数去调整整个字符串集合内的元素次序了。可以采用内置排序方法并指定 `key` 参数指向辅助比较功能;或者直接调用 Python 内置 sorted 函数配合 cmp_to_key 工具简化操作流程[^2]。 ```python from functools import cmp_to_key words.sort(key=cmp_to_key(lambda x,y :compare_strings(x, y, mapping))) print("\n".join(words)) ``` 以上即是对 ABC219C 题目——Neo-Lexicographical Order 的基本求解框架描述。值得注意的是实际编码过程中还需注意边界条件处理以及效率优化等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值