Word(暴力)

该博客介绍了如何使用暴力算法解决字符串匹配问题,其中涉及到子串枚举、字符替换等策略,确保最长公共子串的误匹配数不超过给定限制。代码实现采用C++,并以最短字符串为基础构建初始串进行尝试。

Word

题目大意

给你几个字符串,你要你找一个长度为 l 的串。
保证它可以跟每个字符串匹配,保证这个串有且只有一个。
然后匹配就是字符串存在一个长度为 l 的子串跟它一一匹配不想到的位数不超过 d 个,d 给出。

思路

这题其实可以直接暴力。
就直接选一个字符串(选最短的更优),先枚举子串,然后直接拿这个子串直接去匹配,然后如果不行就换一个字符,换到次数上限就退出。

然后是可以过的,选最短的还跑得挺快。

代码

#include<cstdio>
#include<bitset>
#include<cstring>

using namespace std;

int l, d, sn[31], minn, minx, b[31][55];
char a[31][55];
int ck[11], n;
bool yes;

void dfs(int uc, int x) {
	if (uc > d) return ;
	yes = 1;
	for (int i = 2; i <= n; i++) {//匹配
		int df = 101;
		for (int j = 1; j + l - 1 <= sn[i]; j++) {
			int num = 0;
			for (int k = 1; k <= l; k++)
				if (ck[k] != b[i][j + k - 1]) {
					num++;
					if (num >= df) break;
				}
			df = min(df, num);
		}
		if (df > d) {
			yes = 0;
			break;
		}
	}
	if (yes) return ;
	for (int i = x; i <= l; i++) {//换一个字符
		int rem = ck[i];
		for (int j = 0; j <= 26; j++) {
			if (rem == j) continue;
			ck[i] = j;
			dfs(uc + 1, i + 1);
			if (yes) return ;
			ck[i] = rem;
		}
	}
}

void write() {
	for (int i = 1; i <= l; i++)
		if (ck[i] == 26) putchar(' ');
			else putchar(ck[i] + 'a');
}

int main() {
//	printf("%.3lf", (sizeof(t)) / 1024.0);
	minn = 100; minx = 0;
	
	scanf("%d %d", &l, &d);
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		sn[i] = 0;
		a[i][sn[i] + 1] = getchar();
		while (a[i][sn[i] + 1] != ' ' && (a[i][sn[i] + 1] < 'a' || a[i][sn[i] + 1] > 'z')) a[i][sn[i] + 1] = getchar();
		while (a[i][sn[i] + 1] == ' ' || (a[i][sn[i] + 1] >= 'a' && a[i][sn[i] + 1] <= 'z')) {
			sn[i]++;
			a[i][sn[i] + 1] = getchar();
		}
		a[i][sn[i] + 1] = 0;
		for (int j = 1; j <= sn[i]; j++)
			if (a[i][j] == ' ') b[i][j] = 26;
				else b[i][j] = a[i][j] - 'a';
		if (sn[i] < minn) {
			minn = sn[i];
			minx = i;
		}
	}
	
	for (int i = 1; i <= sn[1]; i++)//根据最小的建立初始串,这样可以很快
		swap(b[1][i], b[minx][i]);
	swap(sn[1], sn[minx]);
	
	for (int i = l; i <= sn[1]; i++) {
		for (int j = i - l + 1; j <= i; j++)
			ck[j - i + l] = b[1][j];
		dfs(0, 1);
		if (yes) {
			write();
			return 0;
		}
	}
	
	return 0;
}
在“天池平台二手车交易价值评估竞赛”这一数据科学任务中,参与者需构建预测模型以估算二手车辆的市场成交价。此类赛事属于机器学习与数据分析领域的典型应用场景,旨在系统提升参赛者的特征构建、模型优化及结果验证能力。下文将分模块阐述关键技术要点: 1. 数据清洗与规整 原始数据集需经过系统处理,包括填补空缺数值、识别离群观测、剔除冗余字段,并将分类变量编码为模型可读的数值形式。此阶段质量直接影响后续建模效果。 2. 特征构建与筛选 需从原始字段中提炼有效预测因子,包括但不限于车辆制造厂商、出厂年份、行驶总里程、外观配色及动力系统配置。基于领域常识可衍生新特征,例如车龄换算、年均行驶强度指数等。 3. 数据分布探查 通过统计图表分析变量间关联规律,例如采用趋势线观察里程数与价格的相关性,使用分位数图示不同品牌的价格区间分布特征。 4. 算法模型选型 常用预测架构包括线性回归模型、树型决策结构、集成学习方法(如随机森林、XGBoost、LightGBM)、支持向量机及深度学习网络。需根据数据特性与计算资源进行综合选择。 5. 参数优化流程 采用K折交叉验证评估模型稳定性,配合网格搜索或随机搜索策略进行超参数调优,以最大化模型预测精度。 6. 集成策略应用 通过Bagging、Boosting或堆叠融合等技术整合多个基模型,通常能获得超越单一模型的表现。 7. 性能度量标准 预测任务常用评估指标包括均方误差、平均绝对误差、均方根误差及决定系数。不同业务场景需针对性选择评估体系。 8. 结果输出规范 最终预测结果需按赛事要求整理为特定结构的数据文件,通常包含样本标识符与对应价格预测值两列。 9. 时序特征处理 当数据包含交易时间维度时,需引入时间序列分析方法(如季节性分解、循环神经网络)捕捉市场波动规律。 10. 工程实践规范 采用Git进行版本追踪,通过模块化编程提升代码可维护性,建立标准化实验记录体系。 该竞赛全面覆盖数据预处理、特征工程、模型构建与验证等核心环节,同时强调工程化实施规范,既能强化技术理论认知,又可培养实际业务场景的问题解决能力。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值