• 一点总结-关于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 }
  • 相关阅读:
    [转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
    [转]Vue-Devtools安装配置教程(献给伸手党)
    [转]vscode 插件推荐
    [转]eclipse中explorer显示方式
    [转]小D课堂
    [转]eclipse中 properties文件编码问题
    [转]windows环境下启动与停止.jar文件
    [转]Maven 国内源配置(2019/2/14)
    [转]Maven 全局配置文件settings.xml详解
    [转]IntelliJ IDEA 2019 上手
  • 原文地址:https://www.cnblogs.com/y119777/p/6171202.html
Copyright © 2020-2023  润新知