
给出两个字符串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)。
#include
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≤10123456
贪心由于给出的数字非常大,需要用字符串读入。
易知一个数字是9的倍数的充要条件是该数各位上的数字之和也是9的倍数。
因此,先计算出读取的字符串各位上的数字之和sum,遍历0~9这10个数字,假设当前遍历到的数字是i,如果i与sum之和是9的倍数,说明插入i能够保证新数字是9的倍数。
接着从 其中
n
n
n指的是数字 给出一个长度为
N
N
N的只包含
1
<
=
N
<
=
5
×
1
0
4
1<=N<=5\times 10^4
1<=N<=5×104 首先需要注意到,如果字符串 因此,只要能够找到一种替换方法使得 一种暴力的方法,是通过递归的方法将 下面主要介绍通过大数据的方法。 显然,暴力方法的时间复杂度为指数级,可以通过动态规划将时间复杂度降低到多项式级别。 先进行分类讨论:如果 设
d
p
[
i
]
dp[i]
dp[i]表示以 由于要验证是否包含长度为6的回文子串,那么在每次添加新的字符 针对字符 具体实现可参考代码。 其中
K
=
5
K=5
K=5。 如果一个整数的所有数字的乘积能被所有数字的和整除,就称这个整数为有趣的。 给出两个整数
A
A
A和
B
B
B,找出
[
A
,
B
]
[A,B]
[A,B]之间有趣的整数个数。
1
≤
A
≤
B
≤
1
0
5
(
小
数
据
)
1≤A≤B≤10^5(小数据)
1≤A≤B≤105(小数据) 目前只会解小数据,大数据的解法可参考Google Kick Start 2022 Round A 题解。 通过枚举
[
A
,
B
]
[A,B]
[A,B]之间的数字,暴力判断组成该整数的所有数字的乘积能能否被所有数字的和整除即可。 其中
n
=
B
−
A
+
1
n=B-A+1
n=B−A+1。 欢迎分享,转载请注明来源:内存溢出N的高位向低位遍历,假设当前遍历到的位上的数字是j,如果ii插入到j之前可以得到最小的数字(想一想为什么?)。
复杂度
N的位数。
Palindrome Free Strings
题意概述
#include 0、1和?构成的字符串S,可以随机用0、1替换掉字符串S中所有的?,问能否找到一种替换方法,使得所得到的串没有长度大于等于5的回文子串。S中包含长度为
n
(
n
>
2
)
n(n>2)
n(n>2)的回文子串,那么将该回文子串首尾两个字符,那么得到的长度为
n
−
2
n-2
n−2的子串必然也是回文的,因此,可以得到结论:如果S中不包含长度为5的回文子串,那么S中必然也不包含长度为
5
+
2
k
(
k
>
0
)
5+2k(k>0)
5+2k(k>0)的回文子串;如果S中不包含长度为6的回文子串,那么S中必然也不包含长度为
6
+
2
k
(
k
>
0
)
6+2k(k>0)
6+2k(k>0)的回文子串。S不包含长度为5和6的回文子串,那么S中必然也没有长度大于等于5的回文子串。S中的字符?逐个替换为0或1,并验证得到的字符串中是否存在长度为5或6的回文子串,时间复杂度为
O
(
n
⋅
2
n
)
O(n\cdot 2^n)
O(n⋅2n),这种方法能够通过小数据。S长度小于5,那么该字符串无论怎么替换?字符,都可以满足要求,直接输出POSSIBLE即可;如果S长度为5,那么可以暴力枚举所有可能得到的替换后的字符串,并验证该字符串是否为回文串即可;下面主要讨论S长度大于5的情况。S的前i个字符能否找到一种替换方法保证没有长度大于等于5的回文子串。S[i]时,S[i]能否构成长度为6的回文子串与S[i]前面的5个字符S[i-5],S[i-4],S[i-3],S[i-2],S[i-1]有关,因此,可以为S[i]的前5个字符标记一个状态,由于每个字符的取值只有0和1两种,因此状态总数为
2
5
2^5
25。S[i],暴力枚举以S[i]结尾的长度为6的子串的可能替换结果字符串j,如果j包含长度为5或6的回文子串,则不符合题目要求;否则
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
′
]
dp[i][j]=dp[i-1][j']
dp[i][j]=dp[i−1][j′],其中
j
′
=
S
[
i
−
6
]
+
j
[
:
5
]
j'=S[i-6]+j[:5]
j′=S[i−6]+j[:5]。
Interesting Integers
题意概述
#include #include
微信扫一扫
支付宝扫一扫
评论列表(0条)