zoukankan      html  css  js  c++  java
  • 最长回文子串

    len <1000000;

       F[i]= min(F[2*j-i],F[j]-2*(i-j)); j为小于i =  > j+F[j]/2 最大的;

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <cstdio>
    #include <vector>
    using namespace std;
    const int maxn = 1000005*2;
    char s[maxn];
    char str[maxn];
    int ans;
    int F[maxn];
    void solve(int n)
    {
           F[0]=1;
           int ma =0;
           for(int i=1; i<n; i++)
            {
                int d=ma*2 -i;
                int los=0;
                if(d<0)
                    {
                        los=0;
                    }
                else los=F[d];
    
                if( d>=0&&F[ma]-(i-ma)*2<0 )
                    {
                        los=0;
                    }
                else if(d>=0)
                    los=min(los,F[ma]-(i-ma)*2);
    
                F[i]=los;
    
                if(i+F[i]/2> ma+F[ma]/2)
                    ma=i;
                int L = i-los/2,R=los/2+i;
    
                while(L-1>=0&&R+1<n&&str[L-1]==str[R+1])
                    {
                         L--;R++;
                    }
    
                d=R-L+1;
                F[i]=d;
                if(i+F[i]/2> ma+F[ma]/2)ma=i;
                if(str[i]=='#')
                    {
                        d--;
                        if(d>0&&str[L]!='#')
                        {
                            ans=max( 2+max( (d-2)/2,0),ans);
                        }
                        else if(d>0)
                        {
                            ans=max(d/2,ans  );
                        }
                    }
                else
                    {
                        if(d>2&&str[L]!='#')
                            {
                                ans=max(ans, 1+(d-1)/2) ;
                            }
                        else if(d>2)
                            {
                                ans=max(ans, 1+(d-3)/2);
                            }
                    }
            }
    }
    int main()
    {
         int cas;
         scanf("%d",&cas);
         for( int cc =1; cc <=cas; cc++)
            {
               scanf("%s",s);
               int n =strlen(s);
               int loc=0;
               for(int i=0; i<n; i++)
                {
                    str[loc++]=s[i];
                    str[loc++]='#';
                }
               ans =1;
               solve(loc-1);
               printf("%d
    ",ans);
            }
    
        return 0;
    }
    View Code
  • 相关阅读:
    左边菜单导航
    css3实现轮播
    js-统计选项个数
    空间评论。回复。点赞功能
    简单的购物车功能
    字符串常用的几种方法
    React,js实现分页的案列
    python2的cgi程序
    开发环境和工具
    github入门
  • 原文地址:https://www.cnblogs.com/Opaser/p/4491394.html
Copyright © 2011-2022 走看看