2086.AI=?
题目描述
Problem - 2086
运行代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 3005;
int main() {
int n;
double Ao, An;
double num[N];
while (cin>>n) {
cin >> Ao>>An;
for (int i = 1; i <= n; i++) {
cin >> num[i];
}
double ans = (n * Ao) / (n + 1) + An / (n + 1);
double k = 2.0 * n;
for (int j = 1; j <= n; j++) {
ans -= k * num[j] / (n + 1);
k -= 2.0;
}
printf("%.2lf\n", ans);
}
return 0;
}
代码思路
2087.剪花布条
题目描述
Problem - 2087
运行代码
#include <string>
#include <vector>
#include <iostream>
using namespace std;
void get_next(vector<int>& next, const string& t) {
int i = 0;
int j = -1;
next.resize(t.size());
next[0] = -1;
while (i < t.size() - 1) {
if (j == -1 || t[i] == t[j]) {
i++;
j++;
next[i] = j;
}
else {
j = next[j];
}
}
}
int kmp(const string& s, const string& t) {
vector<int> next(t.size());
get_next(next, t);
int i = 0,j = 0, count = 0;
while (i < s.size()) {
if (j == -1 || s[i] == t[j]) {
i++;
j++;
}
else {
j = next[j];
}
if (j == t.size()) {
count++;
j = 0; // 重置j以查找下一个匹配项
}
}
return count;
}
int main() {
string s, p;
while (cin >> s && s != "#" && cin >> p) {
printf("%d\n", kmp(s, p));
}
return 0;
}
代码思路
-
引入头文件:
<string>
:用于处理字符串。<vector>
:用于动态数组。<iostream>
:用于输入输出。
-
get_next
函数:- 这个函数用于计算模式字符串
t
的部分匹配表(next数组或fail表)。 - 数组
next
存储的是t
中每个位置之前的最长公共前后缀的长度(或称为“失败函数”值)。 - 初始时,
i
和j
分别指向t
的当前位置和next
表中的前一个位置。 - 当
t[i]
和t[j]
相等时,i
和j
都向后移动一位,并更新next[i]
。 - 如果不匹配(或
j
为-1),则将j
设置为next[j]
(即回退到最长公共前后缀的下一个位置)。
- 这个函数用于计算模式字符串
-
kmp
函数:- 这个函数是KMP算法的主体部分,用于在主字符串
s
中查找模式字符串t
的出现次数。 - 初始时,
i
和j
分别指向s
和t
的当前位置,count
用于记录匹配次数。 - 当
s[i]
和t[j]
相等时,i
和j
都向后移动一位。 - 如果不匹配,则将
j
设置为next[j]
(即回退到最长公共前后缀的下一个位置)。 - 如果
j
等于t.size()
,说明找到了一个完整的匹配项,此时count
加1,并将j
重置为0,继续在下一个位置寻找新的匹配。 - 循环结束后返回匹配次数
count
。
- 这个函数是KMP算法的主体部分,用于在主字符串
-
main
函数:- 使用循环读取主字符串和模式字符串,直到主字符串为
#
为止。 - 对于每一对输入,调用
kmp
函数计算匹配次数,并使用printf
输出结果。
- 使用循环读取主字符串和模式字符串,直到主字符串为
KPM算法
KPM 算法即克努特-莫里斯-普拉特算法(Knuth-Morris-Pratt Algorithm),是一种用于在文本中查找模式字符串的字符串匹配算法。该算法通过利用模式字符串的自身特征,避免了不必要的回溯,从而提高了匹配效率。
以下是使用 KPM 算法解决字符串匹配问题的一般步骤:
- 构建模式字符串的前缀函数:通过对模式字符串进行预处理,计算出每个位置的前缀函数值。前缀函数值表示模式字符串在该位置之前的最长前缀和后缀的长度。
- 进行字符串匹配:从目标字符串的起始位置开始,依次与模式字符串进行比较。根据前缀函数的值,确定在匹配失败时模式字符串需要回溯的位置。
- 重复步骤 2,直到找到匹配的位置或遍历完整个目标字符串。
在使用 KPM 算法时,需要注意以下几点:
- 理解前缀函数的计算方法和含义,这对于正确应用算法至关重要。
- 注意边界情况的处理,例如模式字符串为空或目标字符串长度小于模式字符串长度等。
- 在实际应用中,可能需要根据具体问题进行一些优化和改进,以提高算法的性能。
KPM 算法常用于字符串匹配、文本搜索、模式识别等领域。常见的题目包括在给定的文本中查找特定模式的出现位置、计算模式的出现次数等。