• 最长回文子串


    首先可以用fgets读取一行,用辅助字符数组保存字母和在原数组的序号

    http://blog.chinaunix.net/uid-22566367-id-381994.html

    http://blog.chinaunix.net/uid-21757287-id-327365.html

    接下来有几种方法

    1.依次遍历中心点,分为奇偶回文子串依次分析

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <cctype>
    using namespace std;
    
    #define mem(a,b) memset(a,b,sizeof(a))
    #define pf printf
    #define sf scanf
    #define spf sprintf
    #define debug printf("!
    ")
    #define INF 10000
    #define MAXN 5010
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #define LL long long
    
    char buf[MAXN],s[MAXN],p[MAXN];
    
    int main()
    {
         int n,m=0,i,j,mx=0,x,y;
         fgets(buf,MAXN,stdin);
         n=strlen(buf);
         for(i=0;i<n;i++)
         {
              if(isalpha(buf[i]))
              {
                   p[m] = i;
                   s[m++]=toupper(buf[i]);
              }
         }
         for(i=0;i<m;i++)
              pf("%c",s[i]);
         blank;
    
         for(i=0;i<m;i++)
         {
              for(j=0;i-j>=0 && i+j<m;j++)
              {
                   if(s[i-j]!=s[i+j]) break;
                   if(2*j+1>mx)
                   {
                        mx = 2*j+1;
                        x=p[i-j];
                        y=p[i+j];
                   }
              }
              for(j=0;i-j>=0 && i+j+1<m;j++)
              {
                   if(s[i+j+1]!=s[i-j]) break;
                   if(2*j+2>mx)
                   {
                        mx = 2*j+2;
                        x=p[i-j];
                        y=p[i+j+1];
                   }
              }
         }
         //pf("tt%d %d %d
    ",x,y,mx);
         for(i=x;i<=y;i++)
              pf("%c",buf[i]);
         blank;
    
    }
    /*
    Confuciuss say:Madam,I'm Adam.
    */

    2.Manacher算法

    http://blog.csdn.net/yzl_rex/article/details/7908259

    http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <cctype>
    using namespace std;
    
    #define mem(a,b) memset(a,b,sizeof(a))
    #define pf printf
    #define sf scanf
    #define spf sprintf
    #define debug printf("!
    ")
    #define INF 10000
    #define MAXN 5010
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #define LL long long
    
    char buf[MAXN],s[2*MAXN],p[MAXN],tmp[MAXN],q[2*MAXN],ans=1;
    
    int main()
    {
         int n,m=2,i,j,mx=0,x,y,maxid=0,id,mm;
         mem(q,0);
         fgets(buf,MAXN,stdin);
         n=strlen(buf);
         s[0] = '@';
         s[1] = '#';
         for(i=0;i<n;i++)
         {
              if(isalpha(buf[i]))
              {
                   q[m] = i;
                   s[m++]=toupper(buf[i]);
                   s[m++] = '#';
              }
         }
         s[m]=='';
         for(i=0;i<m;i++)
         {
              pf("%c",s[i]);
         }
         for(i=0;i<m;i++)
         {
              if(maxid>i)
                   p[i] = (p[2*id - i] < (maxid - i) ? p[2*id - i] : (maxid - i));
              else
                   p[i] = 1;
              while(s[i-p[i]]==s[i+p[i]]) p[i]++;
              if(i+p[i]>maxid)
              {
                   maxid = i+p[i];
                   id = i;
              }
              if(ans<p[i])
              {
                   ans = p[i];
                   mm = i;
              }
         }
         pf("
    p[i]:
    ");
         for(i=0;i<m;i++)
         {
              pf("%d ",p[i]);
         }
         blank;
         x = q[mm-p[mm]+2];
         y = q[mm+p[mm]-2];
         pf("tt%d %d",x,y);
         blank;
         for(i=x;i<=y;i++)
              pf("%c",buf[i]);
         blank;
    }
    /*
    RABBATT
    RABNBATT
    Confuciuss say:Madam,I'm Adam.
    */
  • 相关阅读:
    LNMP源码安装配置
    CentOS6 Apache配置详解(上)
    CentOS6 Apache配置详解(中)
    BZOJ4152 AMPPZ2014 The Captain(最短路)
    BZOJ4028 HEOI2015公约数数列(分块)
    Codeforces Round #517 Div. 1翻车记
    BZOJ4027 HEOI2015兔子与樱花(贪心)
    BZOJ4000 TJOI2015棋盘(状压dp+矩阵快速幂)
    Codeforces Round #510 Div. 2 Virtual Participate记
    BZOJ5190 Usaco2018 Jan Stamp Painting(动态规划)
  • 原文地址:https://www.cnblogs.com/qlky/p/5167870.html
Copyright © 2020-2023  润新知