[模板]后缀数组

这是lrj的后缀数组模板

int s[MAXN+10];//char
int sa[MAXN+10],t[MAXN+10],t2[MAXN+10],c[MAXN+10];
void build_sa(int m)
{
	int i,*x=t,*y=t2;
	for(i=0;i<m;i++) c[i]=0;
	for(i=0;i<n;i++) c[x[i]=s[i]]++;
	for(i=1;i<m;i++) c[i]+=c[i-1];
	for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
	
	for(int k=1;k<=n;k<<=1)
	{
		int p=0;
		for(i=n-k;i<n;i++) y[p++]=i;
		for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
		
		for(i=0;i<m;i++) c[i]=0;
		for(i=0;i<n;i++) c[x[y[i]]]++;
		for(i=1;i<m;i++) c[i]+=c[i-1];
		for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];
		
		swap(x,y);
		p=1;
		x[sa[0]]=0;
		for(i=1;i<n;i++)
			if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k])
				x[sa[i]]=p-1;
			else x[sa[i]]=p++;
		if(p>=n) break;
		m=p;
	}
}
int Rank[MAXN+10],h[MAXN+10];
void getheight()
{
	int i,k=0;
	for(i=0;i<n;i++) Rank[sa[i]]=i;
	for(i=0;i<n;i++)
	{
		if(k) k--;
		if(!Rank[i]) continue;
		int j=sa[Rank[i]-1];
		while(s[i+k]==s[j+k]) k++;
		h[Rank[i]]=k;
	}
}



后缀数组的LCP

int LOG(int x)
{
	int res=0;
	while(x)
	{
		x>>=1;
		res++;
	}
	return res-1;
}
int sparse_table[MAXN+10][MAXLOG];
void pre()
{
	int i,j;
	for(i=0;i<n;i++)
		sparse_table[i][0]=h[i];
	for(j=1;j<=MAXLOG;j++)
	{
		int up=n-(1<<j);
		for(i=0;i<up;i++)
			sparse_table[i][j]=min(sparse_table[i][j-1],sparse_table[i+(1<<(j-1))][j-1]);
	}
}
int LCP(int x,int y)
{
	x=Rank[x];
	y=Rank[y];
	Log=LOG(y-x+1);
    return min(sparse_table[x][Log],sparse_table[y-(1<<Log)+1][Log]);
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用模板匹配法识别的过程中,需要先读取模板文件夹中的所有模板,然后对输入图像进行模板匹配。以下是一个简单的 MATLAB 代码示例,演示如何对模板文件夹中的所有模板进行识别: ```matlab % 读取模板文件夹中的所有模板 template_folder = 'path/to/template/folder'; template_files = dir(fullfile(template_folder, '*.png')); num_templates = length(template_files); templates = cell(num_templates, 1); for i = 1:num_templates filename = fullfile(template_folder, template_files(i).name); templates{i} = imread(filename); end % 对输入图像进行模板匹配 input_image = imread('path/to/input/image.png'); for i = 1:num_templates % 在输入图像中查找模板 template = templates{i}; result = normxcorr2(template, input_image); % 取出匹配结果的最大值和对应坐标 [max_value, max_index] = max(result(:)); [y, x] = ind2sub(size(result), max_index); % 显示匹配结果 figure; subplot(1, 2, 1); imshow(input_image); title('Input Image'); subplot(1, 2, 2); imshow(template); hold on; rectangle('Position', [x-size(template, 2)/2, y-size(template, 1)/2, size(template, 2), size(template, 1)], 'EdgeColor', 'r', 'LineWidth', 2); title(['Matched Template ' num2str(i) ', Max Value = ' num2str(max_value)]); end ``` 在上述代码中,`template_folder` 变量存储了模板文件夹的路径,`template_files` 变量使用 `dir` 函数获取了文件夹中所有 `.png` 后缀的文件,`num_templates` 变量表示模板的数量。接着,通过一个循环读取每个模板的图像数据,并将它们存储在 `templates` 变量的单元格数组中。 接下来,使用 `imread` 函数读取输入图像,然后在一个循环中对每个模板进行模板匹配。在 `normxcorr2` 函数中,第一个参数是要查找的模板,第二个参数是输入图像。`normxcorr2` 函数返回一个匹配结果矩阵,其中最大值表示匹配程度最高的位置。通过 `max` 函数和 `ind2sub` 函数,可以找到匹配结果矩阵中最大值的坐标。最后,使用 `imshow` 和 `rectangle` 函数将匹配结果可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值