字符串回文算法超时问题

发布于 2022-09-03 09:48:20 字数 1334 浏览 13 评论 0

总是超过限定的1000ms
图片描述

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char dst[2000000];
char s[1000000];
long P[2000000];

long kp(char *d, long dlen){
    long mid = 1, mx = 1,i = 0, j = 0, k = 0,ans = 0;
    P[0] = -1;
    P[1] = 1;
    for(i = 1;i < dlen;i++){
        j = 2*mid - 1;
        mx = mid + P[mid] - 1;
        if(mx > i){
            P[i] = (P[j]<(mx-mid+1))?(P[j]):(mx-mid+1); 
        }
        else{
            P[i] = 1;
        }
        k = P[i];
        for(;d[i+k] == d[i-k];k++){P[i]++;}
        if(ans < P[i]){
            ans = P[i];
        }
        if(P[i] + i > mx){
            mx = P[i] + i;
            mid = i;
        }
    }

    return ans-1;
}

int main(){
    long n,i,j,t;
    long len[30];
    long dlen;
    long slen;
    char tmp = ' ';
    scanf("%ld",&n);
    for(i = 0; i < n; i++){
        scanf("%s",s);
        dst[0] = '$';
        dst[1] = '#';
        slen = strlen(s);
        for(j = 0; j < slen; j++){
            dst[2*j+2] = s[j];
            dst[2*j+3] = '#';
        } 
        dlen = slen*2 + 2;
        t = kp(dst,dlen);   
        printf("%ld\n",t);
    }
    return 0;
}   

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文