zoukankan      html  css  js  c++  java
  • manacher最长回文序列c++

    算法真心读不懂

    #include <iostream>
    #include<string>
    #include<cstring>

    using namespace std;
    char * pre(char *str)
    {
    int length = strlen(str);
    char *prestr = new char[2*length + 4];
    prestr[1] = '$';
    for(int i=0;i<length;i++)
    {
    prestr[2*(i+1)] = '#';
    prestr[2*(i+1)+1] = str[i];
    }
    prestr[2*length+2]='#';
    prestr[2*length+3]='';
    return prestr;
    }
    int getMaxSym3(char *str)
    {
    char *prestr = pre(str);
    int mx =0, pi=1;//边界和对称中心
    int len = strlen(prestr);
    //辅助数组
    int *p = new int[len];
    p[0] = 0;
    for(int i=1;i<len;i++)
    {
    if(mx>i)
    {
    p[i]=min(mx-i,p[2*pi-i]);//核心
    }
    else
    {
    p[i]=1;
    }
    while(prestr[i-p[i]]==prestr[i+p[i]]&&i-p[i]>0&&i+p[i]<len)
    {
    p[i]++;
    }
    if(i+p[i] > mx)
    {
    mx = p[i] + i;
    pi = i;
    }
    }
    //最大回文字符串长度
    int maxlen = 0;
    for(int i=0;i<len;i++)
    {
    if(p[i]>maxlen)
    {
    maxlen = p[i];
    }
    }
    delete []prestr;
    delete []p;
    return maxlen - 1;
    }
    int main()
    {
    string str="sdghfjkghkdfjdfghjklkjhgfdsawtery";
    int m=str.length();
    char arr[m];
    for(int i=0;i<m;i++)
    {
    arr[i]=str[i];
    }
    int counts=getMaxSym3(arr);
    cout<<counts<<endl;
    return 0;
    }

  • 相关阅读:
    json基础
    css语法以及css选择器
    HTML语义化标签
    CSS插入的四种方式
    Hibernate主键生成策略及选择
    HIbernate处理数据更新丢失
    数据库的四大特性以及事务的隔离级别
    MD5加密
    redis主从复制
    redis的持久化方案
  • 原文地址:https://www.cnblogs.com/8335IT/p/5866371.html
Copyright © 2011-2022 走看看