zoukankan      html  css  js  c++  java
  • 一点总结-关于debug比赛

    上午的题目是:

    1. main里面定义的变量必须手动初始化,使用memset或者其他,函数外或者函数内,会进行初始化为0.

    2. 最长回文子串的马拉车manacher算法,不会写!

    3. 数字三角形dp,水题。

    4. x + y = z,注意判断长度,使用dp,dfs也可以,这是2个字符,还有一个长字符串是否由几个字符串组成。

    5. maximize rectangle,最大矩形,使用stack优化,或者左边,右边,预处理,最后再扫一遍处理。

    6. 多字符串匹配,trie树,我实在没见过这样的写法, c语言的写法,真是看的是不舒服。

    上午真做的水,感觉还是hack练得少,需要在cf上多多联系hack。

    下面复习一下kmp算法和manacher算法。

    kmp 一些点,不注意,很容易出错。

    这个题目,使用kmp,https://leetcode.com/problems/repeated-substring-pattern/

    题解在这里 http://bookshadow.com/weblog/2016/11/13/leetcode-repeated-substring-pattern/

     1 vector<int> p;
     2 void getnext(string s) {
     3     int n = s.size();
     4     p.clear();
     5     p.resize(n);
     6     for (int i = 1; i < n; i++) {
     7         int k = p[i - 1];
     8         while(k && s[k] != s[i])
     9             k = p[k - 1];
    10         if(s[k] == s[i]) k++;
    11         p[i] = k;
    12     }
    13 }
    14 void match(string o, string s) {
    15     getnext(s);
    16     for (int x : p)
    17         cout << x << " ";
    18     cout << endl;
    19     int j = 0;
    20     for (int i = 0; i < o.size(); i++) {
    21         while(j && o[i] != s[j])
    22             j = p[j - 1];
    23         if(o[i] == s[j]) j++;
    24         if(j == s.size()) {
    25             cout << i - (int)s.size() + 1 << endl;
    26             j = p[j - 1];
    27         }
    28     }
    29 }

    manacher 注意最后下边和长度的理解,感觉某一点不注意,就出错了。

     1 string manacher(string s) {
     2     string t = "#";
     3     for (auto x : s) {
     4         t = t + x + "#";
     5     }
     6     //cout << t << endl;
     7     int n = t.size();
     8     vector<int> dp(n, 0);
     9     int id = 0, mx = 0;
    10     int res = 0;
    11     for (int i = 0; i < n; i++) {
    12         if(i < mx)
    13             dp[i] = min(dp[id * 2 - i], mx - i);
    14         else dp[i] = 1;
    15         int left = i - dp[i], right = i + dp[i];
    16         while(left >= 0 && right < n && t[left] == t[right]) {
    17             dp[i]++; left--; right++;
    18         }
    19         if(mx < i + dp[i]) {
    20             id = i;
    21             mx = i + dp[i];
    22         }
    23         if(dp[i] > dp[res])
    24             res = i;
    25     }
    26     for (int i = 0; i < n; i++)
    27         cout << dp[i] << " ";
    28     cout << endl;
    29     return s.substr(res / 2 - (dp[res] - 1) / 2, dp[res] - 1);
    30 }
  • 相关阅读:
    gitlab + gitlab-runner 实现项目的自动化部署测试环境与打包
    docker 部署 zookeeper 集群
    CSS 使用id属性的规则
    SimpleXML使用详解
    PHP通用分页类
    MYSQL远程连接速度慢的解决方法
    远程连接mysql出现1045错误的解决办法
    Bootstrap 元素居中设置
    PHP 时间戳
    html代码/如何做到有横线无竖线的表格/或横线有颜色/竖线没颜色
  • 原文地址:https://www.cnblogs.com/y119777/p/6171202.html
Copyright © 2011-2022 走看看