manacher's algorithm을 이용해서 풀이했고, 웬만한 테스트 입력은 다 통과했는데 도무지 어떤 입력에서 문제가 생기는건지 모르겠습니다...ㅜㅜ
아래는 작성한 코드입니다.
#include <iostream>#include <vector>usingnamespacestd;voidmanacher(vector<char>&S,vector<int>&D){intR=-1;intp=-1;// iterate 0 ~ n-1, fill the palindrome D arrayfor(inti=0;i<S.size();i++){// get the starting pointif(R>=S[i]){D[i]=min(D[2*p-i],R-i);}else{D[i]=0;}while(S[i-D[i]-1]==S[i+D[i]+1]&&(i-D[i]-1)>=0&&(i+D[i]+1)<=S.size()-1){D[i]=D[i]+1;}// update radius R and center p if (i+D[i]) is greater than Rif(i+D[i]>R){R=i+D[i];p=i;}}return;}intmain(){inttc;cin>>tc;for(intt=0;t<tc;t++){intlen;cin>>len;// input example: 4stringinput;cin>>input;// input example: ababvector<char>S;for(inti=0,j=0;i<len*2-1;i++){if(i%2==0){S.push_back(input[j++]);}else{S.push_back('#');}}vector<int>D((unsignedint)S.size());manacher(S,D);intcount=0;for(inti=0;i<D.size();i++){// '#' 인 경우 countingif(D[i]>0&&S[i]=='#'){count+=D[i]-D[i]/2;}// 문자인 경우 countingif(D[i]>1&&S[i]!='#'){// 예제입력인 'EWHSPSHAAHDAA' 를 예로 들면,// 이 문자열 중 'HSPSH' 의 경우 '#H#S#P#S#H#' 가 되고,// 가운데 P에 해당하는 팰린드롬의 값은 5가 됩니다. // 반면, 입력이 'HSPSH' 라면 처리하는 문자열은 // 'H#S#P#S#H' 가 되어 가운데 P에 해당하는 팰린드롬의// 값은 4가 됩니다.// 따라서 이 두 가지 경우 모두 2의 값을 갖게 하기 위해// 다음과 같이 조건을 나누어 처리하였습니다.if(D[i]%2==0){count+=D[i]-D[i]/2;}else{count+=D[i]-D[i]/2-1;}}}cout<<count<<endl;}return0;}
8년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
younghoo88
manacher's algorithm을 이용해서 풀이했고, 웬만한 테스트 입력은 다 통과했는데 도무지 어떤 입력에서 문제가 생기는건지 모르겠습니다...ㅜㅜ
아래는 작성한 코드입니다.
8년 전