HDU - 3294 Girls' research (manacher 템 플 릿 문제)
제목 의 대의: 먼저 문자 ch 를 주 고 ch 는 'a' 임 을 나타 낸다. 이 를 통 해 문자 전환 정의 (즉, ch - 'a' 는 위상 차이 이 고 나머지 문 자 는 위상 차이 에 따라 이동 해 야 한다. 구체 적 으로 처리 하면 코드 를 볼 수 있다) 를 얻 고 소문 자로 구 성 된 문자열 을 주 며 문자열 의 자 모 를 모두 정의 에 따라 전환 시 키 고 마지막 으로 전 환 된 문자열 을 구 해 야 한다.최대 답장 문자열.
사고: 먼저 문자열 을 처리 한 다음 에 manacher 알고리즘 을 뛰 어 다 니 며 최대 답장 문자열 의 중심 위 치 를 기록 하면 됩 니 다. 관련 디 테 일 은 모두 코드 안에 있 습 니 다.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
const int MAX=2e5+10;
void manacher(string s)
{
int len=s.size();
string str="$#";
for(int i=0;i<len;i++)
{
str+=s[i];
str+='#';
}
int len2=2*len+1;
int p[MAX*2];// p[i] str , i
int id=0,mx=0;
int ans=-1;
int index=-1;//index , ,
for(int i=1;i<=len2;i++)
{
int left_i=2*id-i;//i id ,
if(i<mx) p[i]=min(p[left_i],mx-i);// mx-i, id ,left_i i
else p[i]=1;
while(str[i-p[i]]==str[i+p[i]]) p[i]++;// '\0'
if(mx<i+p[i])
{
id=i;
mx=i+p[i];
}
if(p[i]-1>ans)
{
ans=p[i]-1;
index=i;
}
}
if(ans<2) cout<<"No solution!"<<'
';
//s i , str 2*(i+1)
// ok
else if(str[index]=='#')//index
{
int begin=index/2-ans/2;//
cout<<begin<<' '<<begin+ans-1<<'
'<<s.substr(begin,ans)<<'
';
//
}
else
{
int begin=index/2-1-ans/2;
cout<<begin<<' '<<begin+ans-1<<'
'<<s.substr(begin,ans)<<'
';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);// tle
char trie[27]="abcdefghijklmnopqrstuvwxyz";//
char ch;
string s;
while(cin>>ch>>s)
{
int len=s.size();
int ex=ch-'a';//
for(int i=0;i<len;i++)
{
s[i]=trie[(s[i]-'a'+26-ex)%26];//trie[25]=='z', 25 , %26,
}
manacher(s);
}
system("pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
비슷한 이름의 Attribute를 많이 만들어 삭제하는 Houdini사용 소프트웨어는 Houdini16.5입니다 배열에서는 애트리뷰트의 보간이 잘 동작하지 않는 것과 AttributeCreateSOP 노드에서 Size가 4를 넘는 애트리뷰트를 작성해도 값이 조작할 수 없어 의미가 없...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.