病毒侵袭 HDU - 2896 AC自动机

本文介绍了一种使用AC自动机进行病毒串匹配的方法,详细解释了如何通过AC自动机构建和匹配算法来高效地处理大量病毒串的查找。文章强调了在内存限制下优化代码的重要性,避免使用高内存消耗的操作。

题解

使用AC自动机求解 插入病毒串时记录病毒串id 题目保证不同的串有不同的id直接记录即可 使用vis数组记录主串编号 同编号标记的不在处理 注意字符集为所有可见字符
题目内存卡的比较紧 不要使用memset清空数组否则会MLE 原因是开启O2优化时会只消耗使用过的内存

AC代码

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 10; //卡内存
const int MAXC = 128;
int nxt[MAXN][MAXC], sed[MAXN], vis[MAXN], fal[MAXN], idx; //nxt
char s[MAXN];
vector<int> ans;

inline int ID(char c) //
{
	return c;
}
void Insert(char *s, int n, int id) //
{
	int x = 0;
	for (int i = 0; i < n; i++)
	{
		int c = ID(s[i]);
		if (!nxt[x][c])
			nxt[x][c] = ++idx;
		x = nxt[x][c];
	}
	sed[x] = id;
}
void Build()
{
	queue<int> q;
	for (int i = 0; i < MAXC; i++)
		if (nxt[0][i])
			q.push(nxt[0][i]);
	while (!q.empty())
	{
		int f = q.front();
		q.pop();
		for (int i = 0; i < MAXC; i++)
			if (nxt[f][i])
				fal[nxt[f][i]] = nxt[fal[f]][i], q.push(nxt[f][i]);
			else
				nxt[f][i] = nxt[fal[f]][i];
	}
}
void Match(char *s, int n, int id) //
{
	ans.clear();
	int x = 0;
	for (int i = 0; i < n; i++)
	{
		int c = ID(s[i]);
		x = nxt[x][c];
		for (int p = x; p && vis[p] != id; p = fal[p])
		{
			if (sed[p])
				ans.push_back(sed[p]);
			vis[p] = id;
		}
	}
	sort(ans.begin(), ans.end());
}
int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int N, M;
	cin >> N;
	for (int i = 1; i <= N; i++)
		scanf("%s", s), Insert(s, strlen(s), i);
	Build();
	cin >> M;
	int tot = 0;
	for (int i = 1; i <= M; i++)
	{
		scanf("%s", s);
		Match(s, strlen(s), i);
		if (ans.size())
		{
			printf("web %d:", i);
			for (int j = 0; j < ans.size(); j++)
				printf(" %d", ans[j]);
			putchar('\n');
			tot++;
		}
	}
	cout << "total: " << tot << endl;

	return 0;
}
一、基础信息 数据集名称:Bottle Fin实例分割数据集 图片数量: 训练集:4418张图片 验证集:1104张图片 总计:5522张图片 分类类别: - 类别0: 数字0 - 类别1: 数字1 - 类别2: 数字2 - 类别3: 数字3 - 类别4: 数字4 - 类别5: 数字5 - 类别6: Bottle Fin 标注格式:YOLO格式,包含多边形坐标,适用于实例分割任务。 数据格式:图片格式常见如JPEG或PNG,具体未指定。 二、适用场景 实例分割AI模型开发:数据集支持实例分割任务,帮助构建能够精确识别和分割图像中多个对象的AI模型,适用于对象检测和分割应用。 工业自动化与质量控制:可能应用于制造、物流或零售领域,用于自动化检测和分类物体,提升生产效率。 计算机视觉研究:支持实例分割算法的学术研究,促进目标检测和分割技术的创新。 教育与实践培训:可用于高校或培训机构的计算机视觉课程,作为实例分割任务的实践资源,帮助学生理解多类别分割。 三、数据集优势 多类别设计:包含7个不同类别,涵盖数字和Bottle Fin对象,增强模型对多样对象的识别和分割能力。 高质量标注:标注采用YOLO格式的多边形坐标,确保分割边界的精确性,提升模型训练效果。 数据规模适中:拥有超过5500张图片,提供充足的样本用于模型训练和验证,支持稳健的AI开发。 即插即用兼容性:标注格式直接兼容主流深度学习框架(如YOLO),便于快速集成到各种实例分割项目中。
### 关于HDU - 6609 的题目解析 由于当前未提供具体关于 HDU - 6609 题目的详细描述,以下是基于一般算法竞赛题型可能涉及的内容进行推测和解答。 #### 可能的题目背景 假设该题目属于动态规划类问题(类似于多重背包问题),其核心在于优化资源分配或路径选择。此类问题通常会给出一组物品及其属性(如重量、价值等)以及约束条件(如容量限制)。目标是最优地选取某些物品使得满足特定的目标函数[^2]。 #### 动态转移方程设计 如果此题确实是一个变种的背包问题,则可以采用如下状态定义方法: 设 `dp[i][j]` 表示前 i 种物品,在某种条件下达到 j 值时的最大收益或者最小代价。对于每一种新加入考虑范围内的物体 k ,更新规则可能是这样的形式: ```python for i in range(n): for s in range(V, w[k]-1, -1): dp[s] = max(dp[s], dp[s-w[k]] + v[k]) ``` 这里需要注意边界情况处理以及初始化设置合理值来保证计算准确性。 另外还有一种可能性就是它涉及到组合数学方面知识或者是图论最短路等相关知识点。如果是后者的话那么就需要构建相应的邻接表表示图形结构并通过Dijkstra/Bellman-Ford/Floyd-Warshall等经典算法求解两点间距离等问题了[^4]。 最后按照输出格式要求打印结果字符串"Case #X: Y"[^3]。 #### 示例代码片段 下面展示了一个简单的伪代码框架用于解决上述提到类型的DP问题: ```python def solve(): t=int(input()) res=[] cas=1 while(t>0): n,k=list(map(int,input().split())) # Initialize your data structures here ans=find_min_unhappiness() # Implement function find_min_unhappiness() res.append(f'Case #{cas}: {round(ans)}') cas+=1 t-=1 print("\n".join(res)) solve() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值