算法板子整理(c++代码)

本文深入讲解了KMP算法的工作原理及实现过程,包括next数组的生成和匹配过程,是理解字符串搜索算法的重要参考资料。

KMP算法

void getNext(int* nxt, string p){
	memset(nxt, -1, sizeof(nxt));
    nxt[0] = -1;
    int i = 0,j = -1;//j控制前缀,i控制后缀
    int lp = p.size();
    while( i<lp ) {
        if( j==-1||p[i]==p[j] ){
            ++i;
			++j;//先自增,因为PMT向前移动一位
            nxt[i]=j;
        }
        else j=nxt[j];
    }
}
int kmp(string t, string p){
    int i = 0, j = 0;
    int lt = t.size(), lp = p.size();
    int nxt[lp+1];
    getNext(nxt, p);
    while( i<lt&&j<lp ) {
        if( j==-1||t[i]==p[j] ) {
            i++;
            j++;
        }else {
            j=nxt[j];
        }
    }
    if( j==lp ) return i-j;
    else return -1;
}
<think>嗯,用户想要找C++相关的算法模板或代码示例。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的资料。引用1提到了基于NCC的模板匹配算法,引用2是模板方法模式的设计模式,引用3是字符串哈希的算法模板。这些都是C++相关的,可能符合用户的需求。 用户的问比较广泛,可能需要分类整理不同的算法模板,方便他们查找。我需要先确定常见的算法类别,比如排序、查找、字符串处理、设计模式等,然后根据引用内容提供相应的例子。比如快速排序的示例,虽然用户给的示例是Python,但用户需要的是C++,所以需要转换一下。另外,引用3中的字符串哈希算法模板可以直接用,注释详细,适合作为示例。 还要注意用户提到的系统级指令,比如行内公式用$...$,独立公式用$$...$$,并且要生成相关问。需要确保LaTeX语法正确,比如积分符号、数学表达式等。同时,回答要用中文,结构清晰,分步骤解释。 接下来,我需要将各个引用内容整合到不同的算法类别中。例如,引用1的模板匹配属于图像处理或模式识别,引用2的模板方法模式属于设计模式,引用3的字符串哈希属于字符串处理算法。每个部分给出代码示例,并附上相关的问,帮助用户进一步探索。 可能还需要检查代码的正确性,比如字符串哈希的预处理和查询部分是否正确,模板方法模式的示例是否符合设计模式的定义。确保代码示例简洁,注释清晰,便于用户理解。 最后,生成相关问时要围绕每个算法模板的应用、优化、原理等方面,这样用户可以根据问深入学习。例如,关于字符串哈希的问可以涉及冲突处理、不同哈希方法的比较等。 总结一下,步骤应该是:分类整理算法模板,提供每个类别的C++代码示例,确保符合格式要求,添加相关问,并正确引用提供的参考资料。</think>### C++算法模板与代码示例整理 #### 一、排序算法模板 快速排序实现(分治思想): ```cpp #include <vector> using namespace std; void quickSort(vector<int>& arr, int left, int right) { if (left >= right) return; int pivot = arr[left]; // 选择基准元素 int i = left, j = right; while (i < j) { while (i < j && arr[j] >= pivot) j--; arr[i] = arr[j]; while (i < j && arr[i] <= pivot) i++; arr[j] = arr[i]; } arr[i] = pivot; quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); } ``` 时间复杂度为$O(n \log n)$,最差$O(n^2)$[^1] #### 二、字符串哈希算法模板(引用[3]) ```cpp const int N = 1e5+10, P = 131; unsigned long long h[N], p[N]; // 预处理哈希前缀和 void init(const string& s) { p[0] = 1; h[0] = 0; for (int i = 1; i <= s.size(); i++) { p[i] = p[i-1] * P; h[i] = h[i-1] * P + s[i-1]; // s索引从0开始 } } // 获取子串哈希值(闭区间) unsigned long long get_hash(int l, int r) { return h[r] - h[l-1] * p[r-l+1]; } ``` 可用于快速比较字符串子串的相等性[^3] #### 三、模板方法模式(引用[2]) ```cpp class AbstractClass { public: void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); } virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; }; class ConcreteClass : public AbstractClass { public: void PrimitiveOperation1() override { // 具体实现步骤1 } void PrimitiveOperation2() override { // 具体实现步骤2 } }; ``` 通过继承实现算法框架复用[^2] #### 四、模板匹配算法(引用[1]) 基于归一化互相关(NCC)的核心代码片段: ```cpp double computeNCC(Mat& img, Mat& templ, int x, int y) { double sumImg = 0, sumTempl = 0; double sumProduct = 0, normFactor = 0; for (int i = 0; i < templ.rows; i++) { for (int j = 0; j < templ.cols; j++) { double imgVal = img.at<uchar>(y+i, x+j); double templVal = templ.at<uchar>(i, j); sumProduct += imgVal * templVal; sumImg += imgVal * imgVal; sumTempl += templVal * templVal; } } return sumProduct / sqrt(sumImg * sumTempl); } ``` 用于图像识别中的模式匹配[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值