SWUST oj 572: Boyer–Moore–Horspool algorithm

该博客主要介绍了Horspool字符串匹配算法的C++实现,用于在文本中查找子字符串。代码中定义了一个`horspoolMatch`函数,接收两个字符串参数,返回子字符串在主字符串中的起始位置。在主函数中,从标准输入读取字符串并调用该函数进行匹配,最后输出结果。

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

#include<iostream>
#include<cstring>
using namespace std;
int table[26];
int horspoolMatch(char str[],char text[]){
	int len_str = strlen(str);
	int len_text = strlen(text);
	for(int i = 0; i < len_str - 1; i ++){
		table[str[i] - 'A'] = len_str - i - 1;	
	}
	int p = len_str - 1;
	while(p < len_text){
		int k = 0;
		while(str[len_str - 1 - k] == text[p - k] && k < len_str){
			k++;
		}
		if(k == len_str){
			return p - len_str + 1;
		}
		else p += max(table[text[p] - 'A']-k,1);
	}
	return -1;
}
int main(){
	char str[102000],text[700000];
	cin>>str>>text;
	cout<<horspoolMatch( str, text)<<endl;
	return 0;
}

### SWUST OJ 794 题目分析 SWUST OJ 794 的题目通常涉及动态规划或贪心算法的应用。虽然具体题目未提供,但从常见的题型来看,这类问题可能围绕背包问题、序列优化或其他经典的组合优化模型展开。 #### 动态规划的核心思想 动态规划是一种通过分解子问题并保存中间结果来解决复杂问题的方法。其核心在于定义状态转移方程以及初始化条件。例如,在引用中的买家问题中,状态转移方程被定义为: \[ a[i][v] = \max(a[i-1][v], a[i-1][v-w[i]]+c[i]) \] 这表示当前状态下最优解由前一状态的最大值决定,或者从前一状态减去物品重量后的价值加上当前物品的价值得到[^1]。 如果 SWUST OJ 794 是类似的背包问题,则可以采用相似的状态转移逻辑。假设 \( dp[j] \) 表示容量为 \( j \) 时能获得的最大收益,那么状态转移方程可能是: \[ dp[j] = \max(dp[j], dp[j - weight[i]] + value[i]) \] 其中 \( weight[i] \) 和 \( value[i] \) 分别代表第 \( i \) 件商品的重量和价值。 --- #### 贪心策略的可能性 另一种常见方法是贪心算法。如果 SWUST OJ 794 属于区间覆盖、活动安排等问题,则可以通过局部最优选择实现全局最优。例如,引用中的 Coin-row Problem 使用了贪心的思想,即每次取两个连续位置之间的较大值作为下一步的选择依据[^2]。 对于此类问题,代码框架一般如下所示: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> values(n); for (int i = 0; i < n; ++i) { cin >> values[i]; } if (n == 0) { cout << 0 << endl; return 0; } vector<int> dp(n, 0); dp[0] = values[0]; if (n >= 2) dp[1] = max(values[0], values[1]); for (int i = 2; i < n; ++i) { dp[i] = max(dp[i - 1], dp[i - 2] + values[i]); } cout << dp[n - 1] << endl; return 0; } ``` 该代码实现了基于贪心原则的动态规划求解过程,适用于某些特定场景下的最优化问题。 --- #### 可能的边界情况处理 无论使用哪种方法,都需要特别注意边界的设定与异常输入的处理。例如: - 当输入为空集合时,应返回零或提示无解; - 对于负权值的情况,需重新评估是否允许选取这些项目; - 如果存在重复计算的风险,可通过记忆化技术减少冗余操作。 以上几点均有助于提高程序鲁棒性和效率。 --- ### 结论 针对 SWUST OJ 794 的解答路径取决于实际问题描述。如果是典型的背包类问题,推荐运用动态规划;若是更倾向于局部决策累积成整体效果的情形下,则考虑引入贪心机制更为合适。最终方案还需结合具体的约束条件进一步细化调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T1M@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值