马拉车算法(线性求回文串)

参考博客

AC代码(模板)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 4e5 + 10;
char s[maxn], tmp[maxn];
int dp[maxn];
char change(char x, char a){
    return (x - a + 26) % 26 + 'a';
}
///转化方式思想来自对一个圈的点标号(知道取模之后就可以自己推一下)
int main(){
    char a[5];
    while(scanf("%s%s", a, s + 1) != EOF){
    tmp[0] = '!';
    int cnt = 0;
    int len = strlen(s + 1);
    for(int i = 1; i <= len; i++){
        tmp[++cnt] = '#';
        tmp[++cnt] = s[i];
    }
    tmp[++cnt] = '#';///cnt表示新数组tmp的大小(不包括第一个元素tmp[0])
    int pos = 1, right = 2, f, e, index = 0;///很容易知道第一个元素的情况就直接枚举
    f = e = -1;///f、e是tmp数组下标映射到s数组的下标
    dp[0] = dp[1] = dp[cnt] = 1;
    ///right表示当前位置向右延伸的最长位置 + 1
    for(int i = 2; i < cnt ; i++){
        if(i < right) dp[i] = min(dp[2 * pos - i], right - i);
        else dp[i] = 1;
        while(tmp[i - dp[i]] == tmp[i + dp[i]]) dp[i]++;
        if(i + dp[i] > right){
            right = i + dp[i];
            pos = i;
        }
        if(dp[i] > 3 && dp[i] > dp[index]){
            f = (i - dp[i] + 2) / 2;
            e = (i + dp[i] - 2) / 2;
            ///这个自己画一下图就知道为什么了,这也就是为什么我把tmp数组从下标1开始记录#且s数组也是从下标1开始
            index = i;
        }
    }
    if(f < 0 || e < 0) {printf("No solution!\n"); continue;}
    printf("%d %d\n", f - 1, e - 1);
    for(int i = f; i <= e; i++){
        printf("%c", change(s[i], a[0]));
    }
    putchar('\n');
    }
    return 0;
}

全部评论

相关推荐

03-02 08:18
集美大学 Java
钱嘛数字而已:没有赛事奖项么?另外,项目经历字有点多哈,建议突出一下重点:用的什么技术,解决什么问题,达到什么效果。
大家都开始春招面试了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4471次浏览 48人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16917次浏览 137人参与
# 米连集团26产品管培生项目 #
7384次浏览 226人参与
# 沪漂/北漂你觉得哪个更苦? #
1616次浏览 41人参与
# 你的实习产出是真实的还是包装的? #
3230次浏览 54人参与
# 春招至今,你的战绩如何? #
16140次浏览 146人参与
# MiniMax求职进展汇总 #
25260次浏览 322人参与
# HR最不可信的一句话是__ #
1107次浏览 32人参与
# AI面会问哪些问题? #
971次浏览 24人参与
# 你做过最难的笔试是哪家公司 #
1306次浏览 23人参与
# AI时代,哪个岗位还有“活路” #
2930次浏览 53人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152945次浏览 889人参与
# 简历第一个项目做什么 #
32180次浏览 363人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8029次浏览 43人参与
# XX请雇我工作 #
51164次浏览 171人参与
# 简历中的项目经历要怎么写? #
311119次浏览 4271人参与
# 投格力的你,拿到offer了吗? #
178382次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
77008次浏览 375人参与
# AI时代,哪些岗位最容易被淘汰 #
64819次浏览 891人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187635次浏览 1123人参与
# 你怎么看待AI面试 #
180882次浏览 1318人参与
# 正在春招的你,也参与了去年秋招吗? #
364407次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务