최 장 답장 (manacher 알고리즘) (from HDU)

소문 자 영문 문자 a, b, c... y, z 로 만 구 성 된 문자열 S 를 보 여 줍 니 다. S 에서 가장 긴 답장 문자열 의 길 이 를 구 합 니 다. 답장 은 정반 독 과 같은 문자열 입 니 다. 예 를 들 어 aba, abba 등 Input 입력 은 여러 개의 케이스 가 있 습 니 다. 120 조 를 넘 지 않 고 각 조 는 소문 자 영문 문자 a, b, c... y, z 로 구 성 된 문자열 S 두 개의 케이스 사 이 를 빈 줄 로 구분 합 니 다. (이 빈 줄 은 처리 하지 않 아 도 됩 니 다)문자열 길이 len < = 110000 Output 각 줄 의 정수 x 는 하나의 case 에 대응 하여 이 그룹의 case 문자열 에 포 함 된 가장 긴 답장 길 이 를 표시 합 니 다. Sample Input aaaa
abab Sample Output 43 오늘 새로운 알고리즘 을 배 웠 습 니 다: manacher 알고리즘.답문 문자열 에 대한 바늘 알고리즘 입 니 다.소 화 를 한 후에 이 알고리즘 은 동적 계획 의 맛 이 있다 고 생각 합 니 다. 앞의 상 태 를 통 해 현재 상태 에서 의 꼬치 길 이 를 더욱 효과적으로 구 할 수 있 기 때 문 입 니 다.이 문 제 를 직접 풀 면 90% 의 확률 이 시간 을 초과 해 야 하기 때문에 반드시 생각 을 바 꿔 야 한다. 그것 이 바로 manacher 알고리즘 이다.지금 나 에 게 이 알고리즘 을 말 하 라 고 하 는데 이것 은 설명 하기 어렵 고 박문 을 추천 합 니 다.http://blog.csdn.net/xingyeyongheng/article/details/9310555 이 산법 에 대한 해석 은 매우 상세 하 다.코드:
import java.util.Scanner;

public class Main 
{

    public static void main(String[] args) 
    {
         Scanner sc=new Scanner(System.in);
         while(sc.hasNext())
         {
             String s=sc.next();
             char c[]=new char[s.length()*2+3];
             c[0]='*';

             for(int i=0;i2+1]='#';
                 c[i*2+2]=s.charAt(i);
             }
             c[c.length-2]='#';
             c[c.length-1]='?';//        ,                '#'('#'                 ),                         ,            ,        ,               ,         ,        
              int maxLen=0,id=0;
              int p[]=new int[c.length];//p[]      i              ,      ,            for(int i=2;i
              {
                  if(p[id]+id>=i)
                      p[i]=Math.min(p[id-(i-id)], p[id]-(i-id));
                  else
                      p[i]=1;
                  while(c[i-p[i]]==c[i+p[i]])
                      p[i]++;
                  if(p[id]+id

if

(maxLen

// System.out.println(maxLen-1); } } }

좋은 웹페이지 즐겨찾기