Speed Typing
题意概述
给出两个字符串I
和P
,问能否通过删除P
中若干个字符得到I
?如果能的话,需要删除字符的个数是多少?
数据规模
1 ≤ ∣ I ∣ , ∣ P ∣ ≤ 1 0 5 1≤|I|,|P|≤10^5 1≤∣I∣,∣P∣≤105
双指针
设置两个指针i
和j
分别指向I
和P
的第一个字符,滑动指针j
,如果j
指向的字符与i
指向的字符相同,则让i
向后滑动一个字符,当i
滑动到I
字符串末尾或j
滑动到P
字符串末尾后即可结束循环。如果i
滑动到I
字符串末尾,则说明可以通过删除P
中若干个字符得到I
,那么删除的字符个数为 ∣ P ∣ − ∣ I ∣ |P|-|I| ∣P∣−∣I∣;反之则不能。
复杂度
- 时间复杂度为 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} 1≤N