字符串水题

 

HDU - 1686

给A串B串,求A串在B串中出现次数。

A串kmp预处理,然后再对A,B比较,用j表示匹配时A串的pos,则当j>=strlen(A)时候,ans++;

 

 

 

HDU - 2087

给A串和B串,求从A串中能割出来多少个B串。

对A串和B串进行预处理,这个kmp_next数组是基于A和B串的。

即正常的kmp是对同一个串的前缀和当前位置进行比较,得出跳转位置

此处的kmp是对B串的前缀和A串当前位置进行比较,得出跳转位置。

字符串水题_第1张图片

再比较,用j表示匹配是A串的pos,则当j==strlen(B)时候,ans++;

字符串水题_第2张图片

//此处len1为strlen(B),len2为strlen(A)

 

 

 

HDU - 3746

给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。

即求出循环节的长度len-kmpnext[len]

若循环节长度为0,再补一次

否则补齐循环节。

 

HDU - 1358

给你一个字符串,问这个字符串有多少个循环节(从0到pos),求出循环节终止位置和循环次数。

同上,求出循环节长度,然后求出循环节次数。

 

POJ - 2406

给出一个字符串 问它最多由多少相同的字串组成。

判断该字符串能否由循环节构成即可。

 

POJ - 2752 

给定一个字符串s,从小到大输出s中既是前缀又是后缀的子串的长度。

因为只需要求长度,首先s串本身肯定满足,其他满足条件的子串都有个特征,就是该子串的最后一个字符肯定与s的最后一个字符相同。

借助kmp_next数组向前回溯,若s[pos]==s[len-1],则满足条件。

 

HDU - 2594

给你A串B串,求字符串S满足S为A串前缀和B串后缀这个条件的最大长度。

Sol.1

A串+B串跑kmp即可,从kmp_next[len]向前回溯,直到这个len满足len

Sol.2

exkmp

 

 

 

HDU - 3336

统计字符串S的每个前缀在字符串中出现次数。

kmp+dp

假设a是b+1处匹配失败后跳转位置,那么,aa=b,也就是说,前缀a会在b中又出现一次,用dp[a]表示a以及a的前缀在a中出现次数,那么,b以及a的前缀在b中出现次数即为dp[b]=dp[a]+1,得出转移方程

 

转移方程: dp[i]=dp[kmp_next[i]]+1;

 

HDU - 4300

给你一个26个字母表在暗码中的表现结果。

给你一个密码字符串s,由明码s1和暗码s2组成,明码在前暗码在后,但暗码部分有所缺失,问你还原后的最短的密码是什么。

我们先忽略明码,将暗码翻译成明码后,这个新的字符串字符串满足后缀即前缀且长度>len/2的最短字符串不就是我们要的明码吗,但这个题我们不知道暗码的开头在哪里,但我们会求某个串的后缀满足也是前缀的字符串啊,那就把这个字符串全按照暗码转明码转一下,拼接到原字符串后面,再求出满足条件的前缀+后缀就行了。

 

你可能感兴趣的:(字符串)