• 1005 Programming Pattern


    知识点:字符串哈希,二分

    看数据的范围是1e6,目前字符串算法只学了哈希,就用哈希来做,哈希一般都是陪着二分一起来用的,用的方法很简单,就是按照顺序遍历子串,我们可以得到当前子串的出现的次数,

    如果大于已经记录的答案,那么更新答案和位置,我们知道位置,知道子串的长度,那么就相当于知道这个子串的哈希值,就可以来比较了,

    如果等于已经记录的答案,那么说明这个子串和记录的子串不同,我们通过二分来比较两个字符串的大小,这里应该是二分+字符串哈希的关键所在,当比较字典序的两个字符串比较长的时候,我们需要用二分而不是比较函数,这里选择最大化的二分,也就是二分两个字符串相同的长度,那么范围很显然是0到n-1,因为能进入这个分支已经说明两个字符串不同,然后我们再比较第一个不相同的位置的字符的大小就行了,如果当前的字符串更小,那么记录答案并且更新就行了,最后输出答案就行了,

    总结,字符串哈希我们通常使用的就是进制哈希,如果用它来解决高级算法解决的问题的时候,通常时间复杂度多一个log,勉强能过,通常搭配二分一起使用,这里二分就是加快比较两个非常长的字符串的字典序的速度,同时也要牢记进制哈希的基本操作,初始化和查找哈希值,通过类比前缀和,我们查找哈希值的操作一定要通过相减操作来完成,不要有一些奇奇怪怪的操作,比如取模之类的就会错了

    1. #include
    2. using namespace std;
    3. typedef unsigned long long ull;
    4. const int N = 1050000;
    5. const int P = 131;
    6. int n;
    7. ull p[N], h[N];
    8. string s;
    9. unordered_mapint> mp;
    10. void init(int len) {
    11. p[0] = 1;
    12. for (int i = 1; i <= len; i++) {
    13. p[i] = p[i - 1] * P;
    14. h[i] = h[i - 1] * P + s[i - 1];
    15. }
    16. }
    17. inline ull get(int l, int r) {
    18. return h[r] - h[l - 1] * p[r - l + 1];
    19. }
    20. int main() {
    21. scanf("%d", &n);
    22. getchar();
    23. getline(cin, s);
    24. int len = s.size();
    25. init(len);
    26. int Max = 0, pos;
    27. for (int i = 1; i <= len - n + 1; i++) {
    28. ull cur = get(i, i + n - 1);
    29. int cnt = ++mp[cur];
    30. if (cnt > Max) {
    31. Max = cnt;
    32. pos = i;
    33. } else if (cnt == Max) {
    34. int l = 0, r = n - 1;
    35. while (l < r) {
    36. int mid = (l + r + 1) >> 1;
    37. if (get(i, i + mid - 1) == get(pos, pos + mid - 1)) l = mid;
    38. else r = mid - 1;
    39. }
    40. if (s[i + l - 1] < s[pos - 1 + l]) pos = i;
    41. }
    42. }
    43. for (int i = 0; i < n; i++) {
    44. printf("%c", s[pos - 1 + i]);
    45. }
    46. printf(" %d", mp[get(pos, pos + n - 1)]);
    47. return 0;
    48. }

  • 相关阅读:
    计算机毕业设计 SSM电影网站平台 电影信息平台 网络电影平台Java Vue MySQL数据库 远程调试 代码讲解
    JQuery
    *.pcd文件格式
    [C++ 网络协议] IOCP(Input Output Completion Port)
    【吞噬星空】爽翻,徐欣喜提永恒之体,罗峰秒杀败类,阿特金磕头认错
    【微服务】- 配置中心 - Nacos
    Crosstool-NG制作GNU工具链
    【c语言中的指针常量和常量指针介绍】
    《DevOps 精要:业务视角》- 读书笔记(六)
    手搓一个ubuntu自动安装python3.9的sh脚本
  • 原文地址:https://blog.csdn.net/m0_73035684/article/details/127720062