首页 > 其他分享 >初等字符串

初等字符串

时间:2024-02-01 09:02:31浏览次数:29  
标签:hash int long times 字符串 Hash 初等

$CuO + CO \triangleq Cu + CO_2 $

初等字符串

字符串Hash


\(\bf{Hash}:\)一种好用又cd的算法

\(·First\)

如果要比较两个字符串的大小,开\(string\)两两比较是\(O(n)\)の算法如果进行\(m\)次比较的话$O( m \times n ) $显然去世

考虑\(O(m)\)の算法 , 即让比较过程变为\(O(1)\)

那么如果可以将字符串表示成一个数,那么就好说很多了。

如何用k进制来表示一个数?

\(eg:\)

\[(114514)_{10} \ = \ \ \ \ ( \ ? \ )_k \]

......

其实字符串也可以这么表示,最后の值叫他 Hash

对于字符串\(s_1s_2s_3.....s_n\)

我们可以用\(hash_s\)表示

那么\(hash_s:\)
$$ hash_s ={!!!!!!}= s_1*k^{n-1} \times s_2 \times k ^{n-2} \times s_3 \times k^{n-3} \times ... \times s_n \times k^0 $$
其中\(k\)是一个\(\ge\)字符串中最大字符大小の数\((例:Cekasauk中の's')\),最好是个素数(前置知识·素数)

我用\(131\)较习惯

此时是不是觉得\(hash\)非常好用?

\(\mathrm{·美中不足:\color{red}哈希冲突}\)

\(\because\)对于字符来说,\(0\)的值是\(48\)

\(\therefore\)任一其他字符都会很大

如果我在每一个字符上都乘上一个\(131^\alpha\)次方,再乘起来 , 很有可能爆 $long \ long $

\(\therefore\)在计算字符串哈希值时,再摸一个大整数(最好是素数)

这时就可以知道一个字符串の\(hash\)值了。

\(\color{blue}But:\)

$ mod \ p $ 带来の问题十分明显了。

如果两个字符串不相等,但\(mod\)让他们整好相等了,\(hash\)值返回的就是\(WA\)的。

这就叫做哈希冲突。

哈希冲突无法避免,但可以考虑优化。

$·考虑优化\implies second : \ hash \ の优化 $

  1. 双模数哈希

    模一个数\(p\)如果不准的话就再模一个数\(q\),且\(gcd( \ p \ , \ q \ ) \ ={\!\!\!\!\!\!}= 1\)

    精准很多

  2. $ unsigned \ long \ long $

    如果模数太小导致哈希冲突の话,就想方法让模数尽可能的大。

    $ unsigned \ long \ long $ : 是很不错的选择。

    \(2^{64}-1の超大存储量\) ,oppo23,模出你的美

    $ but $ 永远不是完美的

    $unsigned \ long \ long \(是一个\)\rm{很好卡的数值}$。

    出题人会卡死你。
    但平常の题用它还是很不错的。


\(code:(\ of \ unsigned \ long \ long \ )\)

#define int unsigned long long 
using namespace std ; 
const int down = 131 //底数
int does[ N ] ; // down^k
string s ; // 模式串
string b[ N ] ; 
int n ; 
int hash_s , hasher[ N ] ; 
inline void Make_Hash( string s , int &hashwer )
{
    int len = s.size( ) ; 
    for ( int i = 0 ; i < len ; ++ i )
    {
        hashwer += s[ i ] * does[ n - i + 1 ] ; // 看做从一开始
    }
}
signed main( )
{
    cin >> n ; 
    cin >> s ; 
    Make_Hash( s , hash_s ) ; 
    for( int i = 1 ; i <= n ; ++ i )
    {
        cin >> b[ i ] ; 
        Make_Hash( b[ i ] , hasher[ i ] ) ; 
        if( hasher[ i ] == hash_s )
        cout << "Yes" << '\n' ;
        else cout << "Fucking Bich " << '\n' ; 
    }
}

\(·Third - hash \ 求前缀和\)

如果只能比较单个字符串,这个算法就太\(\color{white}逊\)了。

\(\therefore\) 这里有这么个题:

给定模式串b , 目标串s , 求在目标串中的前缀[1,r]是否等于b

\(s\)中前\(i\)个元素

\[\ \ \ \ hash_i = s_1 \times k ^ { n - 1 } \times s_2 \times k ^ { n - 2 } \times ... \times s_i \times k ^{ n - i } \]

\[hash_b = b_1 \times k ^ { i - 1 } \times b_2 \times k ^ { i - 2 } \times ... \times b_i \times k^0 \]

你要让\(b = \!\!= s[ \ 1 \ , \ r \ ]\)

那么b.size( )一定 \(=\!\!=\) s[ 1 , r ].size( )

让\(hash_b\)左右同时乘$k^{ n - i } $

\[hash_b \times k ^{ \ n \ - \ i \ } =\!\!= b_1 \times k ^ { n - 1 } \times b_2 \times k ^ { n - 2 } \times b_i \times k ^ { n - i } \]

\(\because\)模过了数 $ \ \ \ $ \(\therefore\) 不能再除了\((不要和我一样sb)\)

\(\therefore\)只需要比较 \(hash_i\) $ and $ $ hash_b \times k ^{ n - i } $

$ ·Fourth $

求在目标串中与模式串相等の个数

运用\(Thrid\)の知识,自己想(md烦不想写)

标签:hash,int,long,times,字符串,Hash,初等
From: https://www.cnblogs.com/hangry/p/18000480

相关文章

  • Java中比较两个字符串==和.equals()区别
    ​在Java中,==和.equals()都是用于比较两个字符串是否相等的运算符,==比较的是两个字符串的引用地址,而.equals()比较的是两个字符串的内容。只有当两个字符串变量指向同一个字符串对象时,==和.equals()才会返回相同的结果 参考文档:Java中比较两个字符串==和.equals()区......
  • 代码随想录算法训练营第八天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
    反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。题目链接:344.反转字符串-力扣(LeetCode)关于是否用reverse函数解决问题:如果题目......
  • 查找目录中所有内容文本中不含某个特定字符串的文件列表
    查找目录中所有内容中不含某个特定字符串的文件的列表find/your/search/dir-typef!-execgrep-q"PatternString"{}\;-print-typef表示只查找文件;!表示对匹配条件进行取反,即不含特定字符串;{}\; 将每个被找到的文件作为参数传递给find后面的grep命令,其中:花......
  • Java字符串池(String Pool)深度解析
    在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(StringPool)。字符串池由String类私有的维护。   我们知道,在Java中有两种创建字符串对象的方式:1......
  • csharp_获取属性的字符串名称
    PropertySupport\Person.cspublicclassPerson{publicstringName{get;set;}publicstringgetPropertyName(){returnPropertySupport.ExtractPropertyName(()=>Name);}}PropertySupport\Program.csPersonperson=newP......
  • 151. 反转字符串中的单词(中)
    目录题目法一、双指针法二、字符串常用操作题目给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会......
  • C# - 使用 Spire.PDF 将HTML网页、网页内容、HTML字符串转换为PDF
    将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途,满足不同领域和情境下的需求。本文将通过以下两个示例,演示如何使用第三方库Spire.PDFfor.NET和QT插件在C#中将Html网页(URL)或HTML字符串转为PDF文件。 HTML转PDF所需工具:1.Spire.PDFfor.NET首先需要安装S......
  • C# - 将HTML网页、HTML字符串转换为PDF
    将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途,满足不同领域和情境下的需求。本文将通过以下两个示例,演示如何使用第三方库Spire.PDFfor.NET和QT插件在C#中将Html网页(URL)或HTML字符串转为PDF文件。 HTML转PDF所需工具:1.Spire.PDFfor.NET首先需要安装Sp......
  • pdf转base64字符串及base64字符串反转pdf
    pdf转base64//转base64publicStringfileToBase64(){//StringimgFilePath="C:\\Users\\zlf\\Desktop\\pdf\\042002200211_87910810.pdf";StringimgFilePath="C:\\Users\\zlf\\Desktop\\pdf\\【高德打车-38.65元......
  • uniapp ArrayBuffer转16进度字符串 以及 十六进制转ASCII码
    1.ArrayBuffer转16进度字符串//ArrayBuffer转16进度字符串示例//ab2hex(buffer){//consthexArr=Array.prototype.map.call(//newUint8Array(buffer),//function(bit){//......