LuoGu - p1540

기계 번역

주제 배경

첸 소형 컴퓨터 번역 소프트웨어가 컴퓨터에 설치되어, 그는 종종 영어 기사를 번역하는이 소프트웨어를 사용했다.

제목 설명

이 번역 소프트웨어의 원리는 차례로 각 영어 단어가 해당 중국 의미로 대체됩니다, 다만 처음부터 끝까지의, 매우 간단합니다. 메모리가있는 경우 각 영어 단어의 경우, 소프트웨어가 먼저 중국어 단어의 의미를 메모리에 보이는 것, 번역 소프트웨어를 사용, 전혀 기억이없는 경우, 소프트웨어가 사전에 외부 메모리에, 알아 찾습니다 중국 단어 의미와 번역, 이후 검색 및 번역 메모리에 단어와 의미의 번역.

메모리가 존재한다고 가정 M M 단위, 각 단위는 번역 단어 의미를 저장할 수있다. 이미 현재 메모리에 저장된 단어의 수는 이하의 경우 소프트웨어가 새로운 단어 앞에 메모리에 저장 될 때마다 M. 1 M. 1, 소프트웨어는 메모리 유닛에 사용되지 않는 새로운 단어를 저장됩니다, 메모리가 저장 한 경우 M M 단어, 소프트웨어, 장치를 자유롭게 단어를 입력하는 최초의 기억을 지우고 새로운 단어를 개최한다.

길이의 영어 기사 가정 N N 단어. 이 글을 감안할 때, 어떻게 여러 번 외부 메모리 사전을 찾을 필요 번역 소프트웨어를 번역하는? 그 번역 시작을 가정하기 전에 메모리에 단어가 없습니다.

입력 및 출력 형식

입력 형식 :

 

2 개 2 라인. 각 라인은 두 숫자 사이의 공간에 의해 분리된다.

양의 정수의 제 2 막의은 M이 N M , 길이 N 및 기사의 메모리 용량을 나타낸다.

두번째 문제 N 물품의 순서로 N 음이 아닌 정수, 상기 다수의 각 (크기 이하 1000 . 1 0 0 0) 영어 단어를 나타낸다. 두 말은 음이 아닌 정수를 해당과 동일한 경우에만 경우, 같은 단어의 기사입니다.

 

출력 형식 :

 

사전 소프트웨어 요구 사항의 정수.

 

샘플 입출력

입력 샘플 # 1 : 
7 3 
1 2 1 5 4 4 1
출력 샘플 # 1 : 
5

 

코드

#INCLUDE <STDIO.H>
 INT searCnt ( INT MRT [], INT의 CT []);
INT M, N;
INT 의 main () { 
    는 scanf ( " %의 D % d에 " , M, N);
    INT의 MRY [M];
    INT의 CT [N];
    위한 ( int로 I = 0 ; i가 N을 <; 내가 ++ ) { 
        는 scanf ( " %의 D " , CT [I]); 
    } 
    INT nums = searCnt (MRY, CT); 
    의 printf ( " % D \ 없음 " , nums);
    반환  0  ;
}

INT searCnt ( INT MRY [], INT의 CT []) {
     INT 오래 = 0 ;
    INT CURS = 0 , = 셀 0 ; 
    MRY가 [ 0 ]을 CT = [ 0 ]; 오래된 = 0 ; 
    카운트 ++; 똥개 ++ ;
    위한 ( int로 I = 1 ; i가 N을 <I가 ++ ) {
          ( INT의 J = 0 ; J <CURS, J ++ ) {
             경우 (CT [I] == MRY [J]) {
                 체류 다른 ;
            }{ // ! CT [I] = MRY [J] 
                만약 (j curS- == 1 ) {
                     경우 (CURS < M) { 
                        MRY [CURS ++ = 용 CT [I]; 
                        카운트 ++; 휴식 ; 
                    } 
                    MRY [오래] = CT의 [를 I]; 
                    이전 = (이전 + 1 ) %의 M; 
                    카운트 ++; 휴식 ; 
                } 
                계속 ; 
            } 
        } 
    } 
    수익률 계산;
}

 

코드의 생각

해결 방법 1 :

  나는 친구로부터 온 그는 큐 생각했다. 그는, 메모리 큐를 만들 꼬리에 머리 끝 지점을 가리키는 시작 볼 것이다. 시간 복잡도는 현재 디지털 CURS의 개수 (M 메모리 공간) 0 내지 M, CURS 증착 상기 O (N * CURS)이다. 공간 복잡도 : (1000)의 배열을 생성하는 능력.

해결 방법 2 :

  내 자신의 제한된 아이디어 (코드 위),하지만 난 켠 후 시간 복잡도는 O와, (N * 똥개는), 공간 복잡도는 O (M + N), N은 주어진 시퀀스 길이입니다.

  이 질문은 사실 매우 간단합니다 (가상화가 존재하지 않는) 이미 존재하는 경우 "메모리"의 각 자리의 주어진 순서가 이미 존재, 당신은 "사전"을 방문 할 필요가 없습니다 여부를 결정하는 것입니다 생각 그렇지 않으면, 당신은 사전에 액세스하기를 원할 것입니다. 우리는 "메모리"에서가해야 할 때 일치는, 숫자의 개수 ++ 수의 "사전"방문의 수를 발견한다!

추천

출처www.cnblogs.com/kyrie211/p/11111927.html