最长回文

来源:互联网 发布:世界网络银行商城手机 编辑:程序博客网 时间:2024/06/05 04:42
#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <cstring>#include <utility>#define ll long long #define INF 0x3f3f3f3fusing namespace std;const int MAX=1000000+10;char s[MAX*2];int dp[MAX*2];int maxlen,k,cas=0;     //k用来记录已计算过的最长回文串中心位置int main(){    while(scanf("%s",s)!=EOF)    {        if(!strcmp(s,"END"))    break;        cas++;        int len=strlen(s);        maxlen=0,k=0;        for(int i=len;i>=0;i--) //添加"#"        {            s[i+i+2]=s[i];            s[i+i+1]='#';        }        //printf("%s\n",s);            for(int i=2;i<2*len+1;i++)        {            if(dp[k]+k>i)                dp[i]=min(dp[2*k-i],dp[k]+k-i);            else                dp[i]=1;            while(s[i-dp[i]]==s[i+dp[i]])                dp[i]++;            if(dp[k]+k<dp[i]+i)                k=i;            if(maxlen<dp[i])                maxlen=dp[i];        }        printf("Case %d: %d\n",cas,maxlen-1);    }    return 0;}

0 0
原创粉丝点击