HDU 3068回文串

    xiaoxiao2025-02-07  11

    最长回文

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理) 字符串长度len <= 110000   Output 每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.   Sample Input aaaa abab   Sample Output 4 3

    题解:用manacher算法可以O(N)求出。想看具体题解可以去看神犇的解释QAQ。

    for(i=2;i<len+len+1;i++){ if(p[ids]+ids>i){ p[i]=min(p[2*ids-i],p[ids]+ids-i); } else p[i]=1; while(s[i-p[i]]==s[i+p[i]])++p[i]; if(ids+p[ids]<i+p[i])ids=i; if(p[ids]>maxlen)maxlen=p[i]; }

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char s[111111*2]; int p[111111*2]; int main(){ while(scanf("%s",s)!=EOF){ int ids=0,maxlen=0,i,len=strlen(s); for(i=len;i>=0;i--){ s[i+i+2]=s[i]; s[i+i+1]='#'; } s[0]='*'; for(i=2;i<len+len+1;i++){ if(p[ids]+ids>i){ p[i]=min(p[2*ids-i],p[ids]+ids-i); } else p[i]=1; while(s[i-p[i]]==s[i+p[i]])++p[i]; if(ids+p[ids]<i+p[i])ids=i; if(p[ids]>maxlen)maxlen=p[i]; } printf("%d\n",maxlen-1); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1296196.html
    最新回复(0)