苏州h5模板建站,wordpress h1标签优化,做垂直类网站,珠海企业模板建站额……字符串我们是第一次学#xff0c;给大家铺一些基础的不能再基础的基础#xff0c;
字符串比较大小
字符串大小的比较#xff0c;不是以字符串的长度直接决定#xff0c;而是从最左边第一个字符开始比较#xff0c;大者为大#xff0c;小者为小#xff0c;若相等…额……字符串我们是第一次学给大家铺一些基础的不能再基础的基础
字符串比较大小
字符串大小的比较不是以字符串的长度直接决定而是从最左边第一个字符开始比较大者为大小者为小若相等则继续按字符串顺序比较后面的字符比的是ASCII码
字符串输入
cin
接受一个字符串遇“空格”、“TAB”、“回车”都结束
cin.getline()
在一二维字符数组中参数一即为字符数组名参数二为元素个数。
cin.get()
cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格。
getline()
接受一个字符串可以接受空格遇换行结束。包含在string头文件中
getchar()
接受一个字符。包含头文件string
gets()
用法与cin.getline()一样只不过gets不带第三个参数。
OK开始正题来一道题吧。说一下字符串三大杀器HashKMPAC自动机
数字串匹配1 这一题比较简单但是……也有坑哦
错误代码
#include bits/stdc.h
using namespace std;
typedef unsigned long long ull;
ull p[18]{1,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15,1e16,1e17};
ull n,m,X,Y,cnt0;
int main(){cinnXmY;for(ull in-m;i0;i--)cnt(X/p[i]%p[m]Y);coutcntendl;return 0;
}
关键一定要正着循环因为ull为无符号整数永远没有负数i永远0。
正确代码
#include bits/stdc.h
using namespace std;
typedef unsigned long long ull;
ull p[18]{1,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15,1e16,1e17};
ull n,m,X,Y,cnt0;
int main(){cinnXmY;for(ull i0;in-m;i--)cnt(X/p[i]%p[m]Y);coutcntendl;return 0;
}
那么为什么这样一定对呢
请看下图 这样懂了吧这是暴力算法来看下一题
数字串匹配2 取子串这下子usigned long long已经不够了可能要……long long long long long long long long我们每次都要取一个字串那么现在的问题就是如何取子串且复杂度低低低低低。
给一幅图立马懂不懂我倒立洗头 h表示取出来的字串。上图是如何平移窗口数学知识位置原理。懂了吗比较简单。
Hash 那么哈希的目的是什么将一个字符串变成一个整数。如果哈希值相等那么两个字符串就相等。那为什么我们要选一个质数呢因为防止哈希碰撞。什么是哈希碰撞呢因为有可能有两个不同的字符串他们的哈希值相同我们要避免它。讲了半天代码呢
#include bits/stdc.h
#define BASE 131
using namespace std;
typedef unsigned long long ull;
int main(){string s;cins;for(ull i0;is.size();i)hashhash*BASEs[i];couthashendl;return 0;
}
这就是传说中的“哈希值”提醒一下大家大家光看这些内容可能很枯燥建议加上《信息学奥赛一本通—提高篇》食用更佳。
平移窗口
cinnXmY;
ull p[M]{1};
for(ull i1;im;i) p[i]p[i-1]*BASE;
ull hx0,hy0;
for(ull i0;im;i)hxhx*BASEX[i],hyhy*BASEY[i];
ull cnt(hxhy);
for(ull im;in;i){hx(hx-X[i-m]*p[m-1])*BASE;cnt(hxhy);
}
coutcntendl;
前缀哈希
主要是前缀和
ull p[M]{1},n,m,hx[N];
cinnXmY;
for(ull i1;im;i) p[i]p[i-1]*BASE;
ull hY0;
for(ull i0;im;i)hYhY*BASEY[i];
hX[0]0;
for(ull i0;im;i)hXhX[i-1]*BASEX[i];
ull cnt0;
for(ull i0;in-m;i){ull hashhX[im]-hX[i]*p[m];cnt(hashhy);
}
coutcntendl;
拓展哈希冲突
哈希冲突指有两个不同的字符串它们的hash指相等。下面的数学讨论请大家选择阅读。
计算哈希冲突的概率
问题可以抽象成这样给K个随机值非负而且小于N,他们中至少有个相等的概率是多少
我们考虑它的反面问题不相同的概率。对于一个值域为N的Hash值假设你已经挑选出一个值。之后剩下N-1个值是不同于第一个值的因此对于第二次随机生成不同第一个数的概率为
同理不相等的概率就是。好的是这个值约等于好奇的话可以用泰勒公式试一下。那么原来的问题的概率就是。当然我们可以把表达式简化一下。
表达式简化
这是一个极限的算式这个式子当X很小时误差越小大家自己推导着试试。那么简化表达式就变成这样我们就把哈希冲突的概率计算出来了大家学废了吗