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

    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 
    回文就是正反读都是一样的字符串,如aba, abba等

    Input输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 
    两组case之间由空行隔开(该空行不用处理) 
    字符串长度len <= 110000Output每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度. 
    Sample Input

    aaaa
    
    abab

    Sample Output

    4
    3


    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define ll long long int 
    #define ull unsigned long long int 
    #define e 2.718281828459
    #define INF 0x7fffffff
    #pragma warning(disable:4996)
    #define pf printf
    #define sf scanf
    #define max(a,b) (a)>(b)?(a):(b);
    #define min(a,b) (a)<(b)?(a):(b);
    #define pi  acos(-1.0);
    #define  eps 1e-9;
    #include <cstdlib>
    using namespace std;
    
    char ar[110001];
    char temp[220002];
    int p[220002];
    int manacher(int len) {
        int ans = 0;
        int j = 0;
        int id = 0;
        int mx = 0;
        for (int i = 1; i < len; i++) {
            if (i > mx) p[i] = 1;
            else p[i] =min( p[2 * id - i],mx-i);
    
            while (temp[i - p[i]] == temp[i + p[i]])
                p[i]++;
    
            if (i + p[i] > mx) {
                mx = i + p[i];
                id = i;;
            }
            if (ans < p[i])
                ans = p[i];
    
        }
        return ans;
    }
    
    void init(int len) {
        temp[0] = '@';
        temp[1] = '#';
        int j = 2;
        for (int i = 0; i < len; i++) {
            temp[j++] = ar[i];
            temp[j++] = '#';
        }
        temp[j] = '';
    }
    
    int main(void) {
        
        while (sf("%s", ar)!=EOF) {
            int n = strlen(ar);
            init(n);
            int maxlen = manacher(2 * n + 1);//2*n+1:除去最头和最尾
            pf("%d
    ", maxlen-1);
    
        }
        return 0;
    }

    采用manacher算法,在字符串的字符间插入无关字符,再在新串的首尾插入另外的其他无关字符

  • 相关阅读:
    win7开启Administrator账户
    二叉树遍历
    使用NAnt提高工作效率(二)
    系统服务的最简单实现
    右键附加启动命令行
    C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
    百度原CTO李一男经典语录
    Sql开发技巧
    使用NAnt提高工作效率(一)
    对获取config文件的appSettings节点简单封装
  • 原文地址:https://www.cnblogs.com/jiruqianlong/p/9431536.html
Copyright © 2011-2022 走看看