[KMP + 최소 표현법] hdoj 3374: String Problem
첫 번 째 최소 표시 와 최대 표시 의 위 치 를 구하 고 최소 표시 의 개수 와 최대 표시 의 개 수 를 구 하 는 문자열 을 보 여 줍 니 다.
대체적인 사고방식: 최소 표현법 + KMP 에서 확 장 된 최소 반복 문자열 을 한 번 에 마구 잡 이 로 사용 하면 됩 니 다.접미사 배열 을 쓰 려 고 했 는데 1000000 이 넘 는 데 이 터 를 보고 그만 두 었 습 니 다 ~ 멘 붕
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=1000005;
char pat[nMax];
int lenp,next[nMax];
void get_next(){
int i,j=-1;
next[0]=-1;
for(i=1;i<=lenp;i++){ //pat[j] i next
while(j>-1&&pat[j+1]!=pat[i])j=next[j];
if(pat[j+1]==pat[i])j++;
next[i]=j;
}
}
//
int minexp(char *s,int x) {
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x) {
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else {
if(t>0) i+=k+1;
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
//
int maxexp(char *s,int x) {
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x) {
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else {
if(t<0) i+=k+1; //
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
int main(){
int ans,i,j,a,b;
while(scanf("%s",pat)!=EOF){
lenp=strlen(pat);
get_next();
a=minexp(pat,lenp);
b=maxexp(pat,lenp);
int l=(lenp-1)-next[lenp-1];
if(lenp%l==0){
ans=lenp/l;//cout<<lenp/l<<endl;;
}
else{
ans=1;//printf("1
");
}
printf("%d %d %d %d
",a+1,ans,b+1,ans);
}
return 0;
}
//h 3374
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.