编程之美hiho一下求最长回文串的长度

来源:互联网 发布:东方财富网 mac 编辑:程序博客网 时间:2024/06/05 23:08


点击打开链接点击打开链接

#1032 : 最长回文子串

时间限制:1000ms
单点时限:1000ms
内存限制:64MB

描述

   小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。

   这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?”

   小Ho奇怪的问道:“什么叫做最长回文子串呢?”

   小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身为回文串的子串啦~”

   小Ho道:“原来如此!那么我该怎么得到这些字符串呢?我又应该怎么告诉你我所计算出的最长回文子串呢?

   小Hi笑着说道:“这个很容易啦,你只需要写一个程序,先从标准输入读取一个整数N(N<=30),代表我给你的字符串的个数,然后接下来的就是我要给你的那N个字符串(字符串长度<=10^6)啦。而你要告诉我你的答案的话,只要将你计算出的最长回文子串的长度按照我给你的顺序依次输出到标准输出就可以了!你看这就是一个例子。”

提示一提示二提示三提示四
样例输入
3abababaaaaabaaacacdas


提示1:




提示2:

提示3:



提示4:

s



#include<stdio.h>#include<cstring>#include<iostream>#include<vector>#include<cmath>#include<set>#include<utility>#include<string>#include<queue>#include<algorithm>#include<functional>#define LL long long#define MOD 1000000007#define MM 2000010#define Inf (1<<30)using namespace std;char s[MM], str[MM];int L1, L2;int dp[MM];int f[MM];int main(){int T;//freopen("D:\\oo.txt", "r", stdin);scanf("%d", &T);while (T--){L2 = 1;scanf("%s", str);L1 = strlen(str);s[L2++] = str[0];for (int i = 1; i < L1; i++){if (str[i] == str[i - 1]){dp[L2] = dp[L2 - 1] + 1;s[L2++] = str[i];}dp[L2] = dp[L2 - 1];s[L2++] = str[i];}s[L2] = '\0';int flag = 1, res = 1;f[1] = 1;for (int i = 2; i < L2; i++){int j = flag, l, r;f[i] = min(f[2 * j - i], f[j] - 2 * (i - j));l = i - f[i] / 2 - 1;r = i + f[i] / 2 + 1;while (l >= 1 && r < L2&&s[l] == s[r]){f[i] = r - l + 1;res = max(res, r - l + 1 - (dp[r] - dp[l - 1]));l--; r++;}if (i + f[i] / 2 >= flag)flag = i;}printf("%d\n", res);}return 0;}




在这里贴上大牛求最长回文串代码一份,膜拜一下



int fast(char *p){    int ans = 1;    for (int i = 1; p[i]; ++i)    {        int s = i, e = i, t;        while (p[e + 1] == p[i]) ++e;        i = e;        while (p[s - 1] == p[e + 1]) --s, ++e;        if ((t = e - s + 1) > ans) ans = t;    }    return ans;}


0 0