当前位置: 首页 > 编程日记 > 正文

【C++】关联容器学习记录

STL六大组件关系

Containe通过Allocator取得数据存储空间,Algorithm通过Iterator存取Container,Functor内容可以协助Algorithm完成不同的策略变化,Adaptor可以修饰或者套接Functor。

关联容器特性

1. 关联容器定义

顺序容器支持高效的关键字查找和访问,map中的元素是一些关键字-值(key-value)对:关键字其索引作用,值则表示与缩影相关联的数据。set中每个元素只包含一个关键字:set支持高效的关键字查询操作。——检查一个关键字是否在set中。(例如在文本处理中可以保存想要忽略的单词,字典则是mapde 经典应用)。

关键字有序保存数组特性备注
map关联数组:保存关键字-值对
set关键字即值,即只保存关键字的容器
multimap可重复关键字 map
multiset可重复关键字 set
关键字无序保存数组
unordered_map哈希函数 map
unordered_set哈希函数 set
unordered_multimap关键字无序,哈希函数组织map
unordered_multiset关键字无序,哈希函数组织set
  • 例子1:单词计算程序

    string strs[] = { "苹果", "香蕉", "草莓", "苹果", "香蕉", "香蕉", "香蕉", "苹果", "香蕉", "草莓" };map<string, int> countmap;//pair<iterator,bool> insert (const value_type& val);//此类型的insert返回值是一个pair,第一个元素first是一个迭代器,指向新插入元素的map,第二个元素second是一个bool值,插入成功返回true,否则返回falsefor (const auto& e : strs){std::pair<std::map<std::string, int>::iterator, bool> ret = countmap.insert(make_pair(e, 1));if (ret.second == false){ret.first->second++;}}map<string, int>::iterator cit = countmap.begin();while (cit != countmap.end()){cout << cit->first << ":" << cit->second << endl;cit++;}//方式2string strs[] = { "苹果", "香蕉", "草莓", "苹果", "香蕉", "香蕉", "香蕉", "苹果", "香蕉", "草莓" };map<string, int> countmap;//利用find统计每一个元素出现的次数for (const auto& e : strs){map<string, int>::iterator it = countmap.find(e);//countmap.end()是map中最后一个元素的下一个if (it != countmap.end()){//如果找到,value++;it->second++;}else{//若是没有再去插入,又要遍历一遍,有些许冗余countmap.insert(make_pair(e, 1));}}//遍历每一个元素map<string, int>::iterator cit = countmap.begin();while (cit != countmap.end()){cout << cit->first << ":" << cit->second << endl;cit++;}方式3string strs[] = { "苹果", "香蕉", "草莓", "苹果", "香蕉", "香蕉", "香蕉", "苹果", "香蕉", "草莓" };map<string, int> countmap;for (const auto& e : strs){//先调用operator[];再对返回值value进行++。countmap[e]++;}for (auto& e : countmap){cout << e.first << ":" << e.second << endl;}
    
  • 例子2经典的单词计数程序—利用关联数组map和互斥集合set

  • 我们详细讲述了map这个关联数组, 并介绍了经典的单词计数程序,看看这个场景: 单词计数的时候, 不考虑一系列的单词, 如不考虑"abc", "de"等等。 set是个互斥集合, 所以在此可以排上用场了, 且看:

#pragma warning(disable : 4786)
#include <map>
#include <set>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;int main()
{ifstream cin("test.txt"); // 这个cin会屏蔽掉std::cinif(!cin){return 1;}map<string, int> m;string word;set<string> s; // 互斥集合s.insert("abc");s.insert("de");while(cin >> word){if(s.find(word) == s.end()) // 在s中找不到word, 也就是说,word不在s中{m[word]++; // 非常非常经典啊, 我被map折服得五体头地}}map<string, int>::iterator it;for(it = m.begin(); it != m.end(); it++){cout << (*it).first << " " << (*it).second << endl;}return 0;
}

markdown 图片旋转格式

<img src="C:\Users\Administrator\Desktop\pic\set-multiset.jpg" style= "transform: rotate(90deg); zoom: 200%;" />

set-multiset

在这里插入图片描述

map-multimap

在这里插入图片描述

pair 类型

在这里插入图片描述

    1. Write a program to read a sequence of strings and ints , storing each into a pair. Store the pairs in a vector. P381,11.12
  • make_pair 或者pair的4种初始化方式。

     Exercise 11.12:#include <vector>
    #include <utility>
    #include <string>
    #include <iostream>int main()
    {std::vector<std::pair<std::string, int>> vec;std::string str;int i;while (std::cin >> str >> i)vec.push_back(std::pair<std::string, int>(str, i));//vec.push_back(std::make_pair(str, i));//vec.push_back({ str, i });//vec.emplace_back(str, i);                         //!! easiest way.for (const auto &p : vec)std::cout << p.first << ":" << p.second << std::endl;
    }
    
    1. Define a map for which the key is the family’s last name (姓)and the value is a vector of the children’s names. Write code to add new families and to add new children to an existing family.
Exercise 11.7:#include <map>
#include <algorithm>using std::string; using std::vector; using std::map;
using std::cin; using std::cout;
using Families = map<string, vector<string>>;auto make_families()
{Families families;for (string ln; cout << "Last name:\n", cin >> ln && ln != "@q";)for (string cn; cout << "|-Children's names:\n", cin >> cn && cn != "@q";)families[ln].push_back(cn);return families;
}auto print(Families const& families)
{for (auto const& family : families){cout << family.first << ":\n";for (auto const& child : family.second)cout << child << " ";cout << "\n";}
}int main()
{print(make_families());return 0;
}
    1. Could we define a map from vector::iterator to int? What about from list::iterator to int? In each case, if not, why not?
// Exercise 11.10://  vector<int>::iterator to int is ok , because < is defined
//  list<int>::iterator to int is not ok, as no < is defined.
    1. Extend the map of children to their family name that you wrote for the exercises in § 11.2.1 (p. 424) by having the vector store a pair that holds a child’s name and birthday.
// Exercise 11.14:
// Exercise 11.7:#include <iostream>#include <map>#include <string>#include <vector>using std::ostream;using std::cout;using std::cin;using std::endl;using std::string;
using std::make_pair;using std::pair;using std::vector;using std::map;class Families
{
public:using Child     = pair<string, string>;using Children  = vector<Child>;using Data      = map<string, Children>;auto add(string const& last_name, string const& first_name, string birthday){auto child = make_pair(first_name, birthday);_data[last_name].push_back(child);}auto print() const{for (auto const& pair : _data){cout << pair.first << ":\n" ;for (auto const& child : pair.second)cout << child.first << " " << child.second << endl;cout << endl;}}private:Data _data;
};int main()
{Families families;auto msg = "Please enter last name, first name and birthday:\n";for (string l, f, b; cout << msg, cin >> l >> f >> b; families.add(l, f, b));families.print();return 0;
}

关联容器操作

1、关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。
因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。

2、两个主要的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据。
set仅包含一个键,并有效地支持关于某个键是否存在的查询。
set和map类型的对象不允许为同一个键添加第二个元素。
如果一个键必须对应多个实例,则需使用multimap或mutiset类型,这两种类型允许多个元素拥有相同的键。

1.map

1-1. map的定义

1、定义一个map,必须指定关键字和值的类型;
2、从map中提取一个元素时,会得到一个pair类型的对象;
3、map中使用的pair用first成员保存关键字,用second成员保存对应的值;

1-2. map的插入

	map<int,int> mymap;//下标直接创建mymap[5] = 9;mymap[8] = 3;//或者以下4种方式创建mymap.insert(make_pair(2,4));mymap.insert(pair<int,int>(11,7));mymap.insert(map<int,int>::value_type(4,20) );mymap.insert({5,6});//无法覆盖前面的值,如果已经在map中,则什么都不做。  还是5,9//遍历auto iter_map = mymap.begin();cout << "mymap_size:" << mymap.size() << endl;while( iter_map != mymap.end() ){cout << iter_map->first << ' ' << iter_map->second << endl;;iter_map++;}

1-3. map的遍历

	auto iter_map = mymap.begin();cout << "mymap_size:" << mymap.size() << endl;while( iter_map != mymap.end() ){cout << iter_map->first << ' ' << iter_map->second << endl;;iter_map++;}

1-4. map的查找

		if (map.find(3) != map.end()) {cout << "find key=" << map.find(3)->first << ", value=" << map.find(3)->second << endl;}if (map.count(5) > 0) {cout << "find 5: " << map.count(5) << endl;}

1-5. map与unordered_map的区别及优缺点

如果把1-2节中的map替换成unordered_map,则后insert的在前面打印出来。
在这里插入图片描述

区别:

map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。

优缺点以及适用处

map:
优点:
有序性**,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
红黑树,内部实现一个红黑书使得map的
很多操作在lgn的时间复杂度下就可以实现**,因此效率非常的高
缺点:
空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间

适用处:对于那些有顺序要求的问题,用map会更高效一些

unordered_map:
优点: 因为内部实现了哈希表,因此其查找速度非常的快
缺点: 哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

总结:
内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高。
但是unordered_map执行效率要比map高很多
对于unordered_map或unordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的

2.set

2-1.set的定义

set就是关键字的简单集合。当想知道一个值是否存在时,set是最有用的。
定义一个map时,必须即指明关键字类型又指明值类型;
而定义一个set时,只需指明关键字类型。

set中的key_type和value_type是一样的;
set中保存的值就是关键字

2-2.set的插入

set的插入insert两种方法:
1.接受一对迭代器
2.初始化列表

vector<int> ivec = { 2,4,6,8,2,4,6,8};
set<int> set2;
//1.接受一对迭代器
set2.insert(ivec.cbegin(),ivec.cend());
//2.初始化列表
set2.insert({1,3,5,7,1,3,5,7});

2-3.set的遍历

**set<int> set_v;
set_v.insert(  {1,7,8,5,6} );
set_v.insert(5);
set<int>::iterator s_iter = set_v.begin();
while( s_iter != set_v.end() )
{cout << *s_iter << endl;s_iter++;
}
**

2-4. unordered_set

unordered_set 是基于hash表的,因此并不是顺序存储。

迭代器

1. 插入器是一种适配器.

  • 插入迭代器

    back_inserter 创建一个push_back的迭代器。

    fornt_inserter 创建一个push_front的迭代器

    inserter创建一个使用insert的迭代器。

    demo1

    list<int> lst = { 1,2,3,4 };
    list<int> lst2, lst3;
    copy(lst.begin(), lst.end(), front_inserter(lst2));
    copy(lst.begin(), lst.end(), inserter(lst3,lst3.begin()));
    

2. iostream 迭代器

istream_iterator<T> in(is); in从输入流is读取类型为T的值
istream_iterator<T> end;	读取类型为T的值istream_iterator迭代器,表示尾后位置in1 == in2 in1与in2必须读取相同的类型,如果他们都是尾后迭代器,或绑定到相同的输入,则两者相同
in1 != in2
*in 	返回从流中读取的值
in->mem 与 (*it).mem 的含义相同
++in , in++ 前置版本返回一个指向递增后迭代器的引用,后置版本返回旧值

istream_iterator调用 accumulate:

istream_iterator<int> in(cin), eof;
cout<< accumulate(in, eof, 0)<<endl;

3. ostream_iterator操作

  • 方式1
ostream_iterator<int> out_iter(cout, " ");
for(auto e : vec)*out_iter++ = e;
cout<<endl;
  • 方式2

当对out_iter赋值时,可以忽略解引用和递增运算。即循环可以写成如下的样子

for (auto x : vec)out_iter = e;
cout<<endl;

推荐第一种方式,推荐方式1,原因是这种写法 使得流迭代器和其他类型的迭代器保持一致。

反向迭代器

反向迭代器:++ 表示向前移动,–表示向后移动

	vector<int> vec = { 1,2,3,4,5,6 };for (auto riter = vec.crbegin(); riter != vec.crend(); ++riter) {cout << *riter << endl;} // 6 5 4 3 2 1
sort(vec.rbegin(), vec.rend());// 1,2,3,4,5,6 

泛型算法结构p365

相关文章:

图像 DFT 变换

// 通道组建立&#xff0c;cv::Mat groupMats[] {cv::Mat_<float>(sizeConvMat),cv::Mat::zeros(sizeConvMat.size(), CV_32F)};cv::Mat mergeMat;// 通道合并merge(groupMats,2,mergeMat);// DFT变换dft(mergeMat, mergeMat);// 分离通道split(mergeMat, groupMats);/…

MySQL innodb_autoinc_lock_mode 详解

innodb_autoinc_lock_mode这个参数控制着在向有auto_increment 列的表插入数据时&#xff0c;相关锁的行为&#xff1b; 通过对它的设置可以达到性能与安全(主从的数据一致性)的平衡 【0】我们先对insert做一下分类 首先insert大致上可以分成三类&#xff1a;     1、simpl…

小程序代理加盟实现月入1800到50K

他出身寒门&#xff0c;没钱没资源&#xff0c;搬过砖利用身边的健身达人赚过钱&#xff0c;毕业了院长看他很努力还安排过维修多媒体的工作&#xff0c;拒绝院长好意的他&#xff0c;月收入从1800到1万&#xff0c;再到赚到人生首个5万。 只用了一年&#xff0c;他到底是凭什么…

CCF201503-4 网络延时(100分)

试题编号&#xff1a; 201503-4 试题名称&#xff1a; 网络延时 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给定一个公司的网络&#xff0c;由n台交换机和m台终端电脑组成&#xff0c;交换机与交换机、交换机与电脑之间使用网络连…

【Smart_Point】动态内存与智能指针

动态内存 动态内存使用的三种原因 程序不知道自己需要多少对象程序不知道所需对象的准确类型程序需要在多个对线之间共享数据 文章目录动态内存动态内存使用的三种原因实例1&#xff1a; Exercise 12.2:Write your own version of the StrBlob class including the const ver…

JS中的null和undefined,undefined为啥用void 0代替?

起因 某天,在看某位同学的js代码,代码中发现了一个奇怪的东西 void 0,虽然第一眼看不懂这是什么东西,但是根据上下文,这里应该是想判断是否等于undefined,为什么要这样写的,有什么渊源吗?顺便就把undefined和null都拿出来复习了一下. 介绍 undefined和null是js中类型七种数据类…

【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)

文章目录Cpp读入结构性数组文本查询程序文本查询程序本版1Cpp读入结构性数组 #include<sstream> #include<iostream> #include<string>std::vector<cv::Point2f> point_calibartion_position;std::string filename "C:/Users/Administrator/Des…

我眼中的DevOps(转)

过去一年以来&#xff0c;一批来自欧美的、不墨守陈规的系统管理员和开发人员一直在谈论一个新概念&#xff1a;DevOps。DevOps 就是开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;这两个领域的合并。&#xff08;如果没错的话&#xff0c;…

【阿圆实验】Consul HA 高可用方案

一、建立Consul Cluster环境 利用Consul提供的服务实现服务的注册与发现&#xff0c;需要建立Consul Cluster。在Consul方案中&#xff0c;每个提供服务的节点上都要部署和运行Consul的agent&#xff0c;所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种…

【C++】拷贝,赋值与构造

拷贝&#xff0c;赋值与构造 文章目录拷贝&#xff0c;赋值与构造1. 拷贝构造函数/合成拷贝构造函数&#xff08;copy constructor&#xff09;2. 拷贝赋值运算符3. 析构函数1. 拷贝构造函数/合成拷贝构造函数&#xff08;copy constructor&#xff09; 1.1 定义&#xff1a;复…

Java 内存查看与分析

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff1a;gc日志输出 在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime&#xff0c;jvm将会按照这些参数顺序输出gc概要信息&#xff0c;详细信息&…

玩转Vuejs--核心原理

一、摘要&#xff1a; Vuejs是一款前端MVVM框架&#xff0c;利用Vuejs、webpack以及周边一系列生态工具我们可以快速的构建起一个前端应用&#xff0c;网上对于Vue的分析大都是基于各个模块&#xff0c;理解起来不够顺畅&#xff0c;本文将从整个执行过程出发&#xff0c;讲一下…

【C++】拷贝控制与资源管理

1. 拷贝控制与资源管理 管理类外资源的类必须定义拷贝控制成员。如P447中所见&#xff0c;这种类需要通过析构函数来释放对象所分配的资源。一旦一个类需要析构函数&#xff0c;那么几乎可确定它也需要一个拷贝构造函数和一个拷贝赋值函数。 明确拷贝语义&#xff1a;可以定义…

leangoo V5.4.2版上线

本次更新增加了“卡片编辑面板内显示成员、截止日期、工作量”的功能。同时我们也进行了大量的功能优化&#xff0c;以下是此次更新详情&#xff1a; 1. 新增“卡片编辑面板内显示成员、截止日期、工作量”功能 本次更新后 &#xff0c;您在卡片编辑面板内添加成员&#xff0c;…

差分边缘检测实现

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace cv; // 图像差分操作 void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage,cv::Mat& edgeYImage) {cv::Mat…

2.1:CGPROGRAM

文章著作权归作者所有。转载请联系作者&#xff0c;并在文中注明出处&#xff0c;给出原文链接。 本系列原更新于作者的github博客&#xff0c;这里给出链接。 前言 经过前面两个章节的铺垫&#xff0c;我们对渲染以及Unity Shaderlab相关的知识已经有了大概的认识&#xff0c;…

【OpenCV】OpenCV中积分图函数与应用

OpenCV中积分图函数与应用 参考资料 opencv 查找integral&#xff0c;目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#gadeaf38d7701d7ad371278d663c50c77dhttps://blog.csdn.net/jia20003/article/details/52710751ht…

django学习笔记【003】创建第一个带有model的app

【1】python应用程序要连接mysql有多个驱动程序可供选择&#xff1a; 1、MySQLdb 这个只支持python2.x 所以在这里就不说了&#xff1b; 2、mysqlclient 下载地址   https://pypi.python.org/pypi/mysqlclient/1.3.9 3、MySQL Connector/python 这个是mysql官方主推的mysql驱…

图像非极大值抑制 Sobel 边缘实现

bool SobelVerEdge(cv::Mat srcImage, cv::Mat& resultImage) {CV_Assert(srcImage.channels() 1);srcImage.convertTo(srcImage, CV_32FC1);// 水平方向的 Sobel 算子cv::Mat sobelx (cv::Mat_<float>(3,3) << -0.125, 0, 0.125,-0.25, 0, 0.25,-0.125, 0, …

第四次作业 (日期和jieba库的运用)

设计题1&#xff1a; 设计一个本月份日历&#xff0c;输出格式如下&#xff1a; 要求&#xff1a; 1.初始化start_day&#xff0c;end_day两个日期 from datetime import datetime start_daydatetime(2019,4,1) end_daydatetime(2019,4,30) 其它时间数据生成要用datetime或date…

【C++】LINK类型错误分析记录

LINK类型错误 情况1&#xff1a; 根据生成路径&#xff0c;查找是否成功生成静态库/动态库&#xff0c;一般在./bin文件中。 情况2&#xff1a; 是否在CMakeLists中target_link_libraries中添加链接静态库操作 情况3&#xff1a; 是都存在类模板&#xff0c;需要实例化&a…

eBay宣布发布全新的购买和销售APIs

eBay最近宣布发布两款全新的购买和销售APIs。这些APIs旨在促进eBay产品在第三方应用程序中的更好集成。eBay于10月19日在他们的博客上发表了几篇文章&#xff0c;不仅详细介绍了这些全新的购买和销售APIs提供的功能&#xff0c;而且还详细地总结了他们公司从SOAP&#xff08;简…

Sobel 边缘实现

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace cv; // 非极大值抑制实现sobel竖直细化边缘 bool SobelVerEdge(cv::Mat srcImage, cv::…

vue下实现textarea类似密码框的功能之探索input输入框keyup,keydown,input事件的触发顺序...

项目中引入element的input框组件&#xff0c;触发事件必须要加上.native <el-input placeholder"请输入" type"textarea" v-model"valueText" keyup.native"keyUp(valueText,$event)" keydown.native"keyDown($event)" …

【C++】动态内存管理/move/以及移动构造与移动赋值运算符

文章目录1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案c中临时变量不能作为非const的引用参数2. 动态内存管理类3. 对象移动与右值引用4. 移动构造与移动复制运算符1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案 问题描述&#xff1a; bool Cr…

图像直接卷积 Sobel 边缘实现

bool sobelEdge(const cv::Mat& srcImage, cv::Mat& resultImage,uchar threshold) {CV_Assert(srcImage.channels() 1);// 初始化水平核因子Mat sobelx (Mat_<double>(3, 3) << 1, 0,-1, 2, 0, -2, 1, 0, -1);// 初始化垂直核因子Mat sobely (Mat_&…

JSON.parse解析特殊字符报错解决方案

2019独角兽企业重金招聘Python工程师标准>>> 具体案例&#xff1a; 页面点击”下一任务” 会去请求后台&#xff0c;这里出现的问题是有虚拟任务的时候。然后会返回一个map&#xff0c;也就是如下图中回调函数中的data。 当该map里存有以下字符的时候&#xff1a; \…

MySQL数据库字符集和整理

MySQL数据库字符集和整理(2009-11-20 22:23:37)mysql数据库 it 其实这个表在MySQL数据库中通过phpMyAdmin就能看到&#xff0c;icech只是把表格整理了一下方便大家使用&#xff0c;如果要更换数据库的字符集&#xff0c;心里有数。其中有三种utf8_general_ci、utf8_unicode_ci…

【SLAM后端】—— ceres优化相机位姿求解

求解结果如下&#xff1a; mat 初始化&#xff0c;eigenvalue初始化 Mat K ( Mat_<double> ( 3,3 ) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1 );Eigen::Matrix<float,3,1> vd_3d;v_3d << 3, 2, 1;求解目标函数结构体构造与实例 struct CurveFi…

SPOJ 1811 LCS [后缀自动机]

题意&#xff1a; 求两个串的最大连续子串 一个串建SAM&#xff0c;另一个串在上面跑 注意如果走了Suffix Link&#xff0c;sum需要更新为t[u].val1 Suffix Link有点像失配吧&#xff0c;当前状态s走不了了就到Suffix Link指向的状态fa上去&#xff0c;fa是s的后缀所以是可行的…