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;
    }

  • 相关阅读:
    django使用redis
    Python连接redis
    Redis 字符串(String)
    Redis 列表(List)
    Redis 集合(Set)
    Redis 哈希(Hash)
    Python获取时间范围
    如何查看oracle当前连接数,会话数
    python装饰器
    windows通过ssh连接虚拟机中的ubuntu步骤
  • 原文地址:https://www.cnblogs.com/8335IT/p/5866371.html
Copyright © 2011-2022 走看看