当前位置: 首页 > news >正文

KMP和Manacher

以下代码相关注释未完善,大体内容如下:

#include <iostream>
#include <vector>
#include <string>
#include <string_view>#define S(X) 		for (char i : X) {\std::cout << i;\}\class KMP {
public:KMP() = default;~KMP() = default;KMP(const KMP& k) = delete;KMP(const KMP&& k) = delete;//    0 1 2 3 4 5 6//    A A B A B A A//    0 1 0 1 0 1 2
private:std::vector<int> generate_next(const std::string& str) {std::vector<int> n(str.size());for (int i = 1, j = 0; i < str.size(); i++) {while (str[i] != str[j] && j > 0) {j = n[j];}if (str[i] == str[j]) {n[i] = ++j;}}return n;}//std::vector<int> generate_next(const std::string c_pair) {//	int len = c_pair.size();//	std::vector<int> n(len);//	int i = 1, j = 0;////	while (i < len) {//		if (c_pair[j] == c_pair[i]) {//			n[i] = j + 1;//			i++;//			j++;//		}//		else if (j == 0) {//			n[i] = 0;//			i++;//		}//		else {//			j = n[j - 1];//		}//	}//////	S;//	return n;//}void better_next(std::vector<int>& n, const std::string& c_pair) {for (int i = 1; i < c_pair.size(); i++) {if (c_pair[i] == c_pair[n[i]]) {n[i] = n[n[i]];}}}public:std::vector<int> search(const std::string& pair, const std::string& want) {std::vector<int> next = generate_next(want);better_next(next, want);std::vector<int> res;for (int i = 0, j = 0; i < pair.size(); i++) {while (j && pair[i] != want[j]) {j = next[j];}if (pair[i] == want[j]) {j++;}if (j == want.size()) {res.emplace_back(i - j + 1);j = 0;}}return res;}};class Manacher {
public:Manacher() = default;~Manacher() = default;Manacher(const Manacher& m) = delete;Manacher(const Manacher&& m) = delete;private:std::vector<int> half_len;private:std::string insert_hash(const std::string& s) {std::string out;out.reserve(s.size() * 3);out += '^';for (char ch : s) {out += '#';out += ch;}out += "#$";//S(out);return out;}
public:void process(const std::string& s) {std::string str = insert_hash(s);half_len = std::vector<int>(str.size());int mid = 0, hr = 0;for (int i = 1; i < str.size(); i++) {int hl = 1;if (i < hr) {hr = std::min(half_len[mid * 2 - i], hr - i);}while (str[i - hl] == str[i + hl]) {hl++;mid = i;hr = i + hl;}half_len[i] = hl;}}bool judge(int left, int right) {return (right - left) <= half_len[right + left - 2];}};int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);KMP k;std::vector<int> index = k.search("wworawotaworiooworia", "wori");for (int i : index) {std::cout << i << ' ';}std::cout << std::endl;Manacher m;m.process("wocoeocliefuckkcuf");std::string_view res_1 = m.judge(3, 5) ? "True" : "False";std::string_view res_2 = m.judge(2, 6) ? "True" : "False";std::string_view res_3 = m.judge(2, 7) ? "True" : "False";std::cout << res_1 << std::endl << res_2 << std::endl << res_3 << std::endl;return 0;}
http://www.hskmm.com/?act=detail&tid=32610

相关文章:

  • 10月16日日记
  • 日志|二叉树|404左叶子之和|112路径总和|129求根节点到叶子节点数字之和|
  • 第 5 天:C 语言运算符与表达式 —— 数据处理的优秀的工具集
  • mongoDB体验
  • TELUS如何通过Google技术栈实现业务增长与生产力跃升
  • 云服务器上部署 EasyTier中转服务器
  • 问世界
  • 为 .NET 10 GC(DATAS)做准备
  • LLM学习记录DAY3
  • 日总结 13
  • 黄景行电脑软件
  • 开源许可协议 gpl vs mit?
  • 二进制警报器
  • 题解:P8019 [ONTAK2015] OR-XOR
  • DP 思维好题(转载)
  • python sse的是什么?
  • idea代码阿里格式化
  • 万字长文详述单据引擎原理、流程、单据管理 - 智慧园区
  • windows 链接共享打印机出现错误0x00000709?打印机0x0000011b错误?0x0000bcd、0x00000709、0x00000011b
  • 解码Linux文件IO目录检索与文件属性
  • p66实验题
  • 【比赛记录】2025NOIP 冲刺模拟赛合集I
  • 20251016
  • C# - 串口助手
  • 使用SpringBoot+MyBatisPlus实现增删改查
  • P4168 [Violet] 蒲公英题解
  • Java了解
  • VGG使用块的网络
  • 使用SpringBoot + Thymeleaf + MyBatisPlus实现一个简单的书籍管理系统
  • Linux 基础