Google kickstart 2022 Round A题解

Speed Typing

题意概述

给出两个字符串IP,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少?

数据规模

1 ≤ ∣ I ∣ , ∣ P ∣ ≤ 1 0 5 1≤|I|,|P|≤10^5 1I,P105

双指针

设置两个指针ij分别指向IP的第一个字符,滑动指针j,如果j指向的字符与i指向的字符相同,则让i向后滑动一个字符,当i滑动到I字符串末尾或j滑动到P字符串末尾后即可结束循环。如果i滑动到I字符串末尾,则说明可以通过删除P中若干个字符得到I,那么删除的字符个数为 ∣ P ∣ − ∣ I ∣ |P|-|I| PI;反之则不能。

复杂度

  • 时间复杂度为 O ( m a x ( ∣ I ∣ , ∣ P ∣ ) ) O(max(|I|,|P|)) O(max(I,P))
  • 空间复杂度为 O ( 1 ) O(1) O(1)

C++代码

#include <bits/stdc++.h>
using namespace std;
using gg = long long;
#define rep(i, a, b, c) for (gg i = (a); i <= (b); i += (c))
#define rrep(i, a, b, c) for (gg i = (a); i >= (b); i -= (c))
constexpr gg MAX = 1e6 + 5;
constexpr gg mod = 1e9 + 7;
constexpr gg INF = 4e18;
constexpr double eps = 1e-12;
gg ti, ni, mi, ki, di, pi, xi, yi;
gg up(gg n, gg m) {
    return n >= 0 ? (n + m - 1) / m : n / m; }
gg down(gg n, gg m) {
    return n >= 0 ? n / m : (n - m + 1) / m; }
//! ti; MAX; mod; 边界
void solve() {
   
    string s1, s2;
    cin >> s1 >> s2;
    gg i = 0, j = 0;
    for (; i < s1.size() and j < s2.size(); ++i, ++j) {
   
        while (j < s2.size() and s1[i] != s2[j]) {
   
            ++j;
        }
        if (j == s2.size()) {
   
            break;
        }
    }
    i == s1.size() ? cout << s2.size() - s1.size() : cout << "IMPOSSIBLE";
}
int main() {
   
    ios::sync_with_stdio(false);
    cin.tie(0);
    ti = 1;
    cin >> ti;
    for (gg ii = 1; ii <= ti; ++ii) {
   
        cout << "Case #" << ii << ": ";
        solve();
        cout << "\n";
    }
    return 0;
}

Challenge Nine

题意概述

给定一个正整数 N N N,在给定的数字 N N N的任意位置插入一个[0,9]之间的数字,得到一个不带前导零的新的数字,需要保证这个新的数字是9的倍数。问能构造出的最小的数字是多少?

数据规模

1 ≤ N ≤ 1 0 123456 1≤N≤10^{123456} 1N

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值