무거운 브러시 제목 / 게임을 선고 할 때 종종 문제가 발생,이 문제는 문자열에 무거운 문장에 대해 이야기하는 것입니다.
해시는 무엇입니까 ▎
우리가 일반적으로 생각 중공업 문장? 샤오 총통이 먼저 버킷 종류라고 생각, 그것은 해시 방법이다 이런 종류의 사실, 해시는 더 적절한 배럴의 무리로 이해했다.
15,411,356을 예를 들어, 현재 (즉 반복되지이다) 디지털 여러 총을 판단 할 수 있도록, 당신에게 숫자의 무리를 제공합니다. 해결하기 위해 아이디어를 해시하는 것은 이것이다 :
버킷의 숫자를 넣어, 각 버킷은 숫자, 그들에 얼굴에 해당하는 수를 나타냅니다, 판단 여러 디지털 무언가로 변환 판사는 여러 배럴이있다.
방법이 배럴을 유지하는 방법 : 그래서, 다음 문제에 대해 생각? 같은 ...... 배열 인덱스 배럴의 수를 표현하기 위해 절대적으로 불가능 반복의 양만큼이 배럴을 유지하기! 우리는 버킷까지의 숫자가 배열 요소에 대응하는 값이 무엇인지, 각 버킷 배열 첨자를 사용할 수있다. 예를 들어, 배열을 사용하여 이들 유지 버킷라고하는 [3] ++만큼 숫자 3에 직면했을 때, 그것에.
사실, 이것은 해시, 그래서 더 생생한 배럴의 더미에 그 이해입니다.
해시 문자열에서 ▎
여기를 참조하십시오, 당신이 원하는 것, 해시 문자열에 대해 얘기 할 게 없다? 진리가 아닌가? 당연하지! 그것에 대해 생각하는 방법을 문자열 배열이 첨자 저장하기? 배열 첨자 아, 정수!
이 방법에서 그것은 매우 가볍고 넓은이며, 우리는 정수 처리에 문자열을 변환 할 수 있습니다!
기억 하는가? Shihai을 배울 수있는 처음에 배운 ASCII 코드는, 우리는 정수 캐스트로 대체 될 수있다.
그러나 문제는 다시, 어떻게 ASCII로 문자열을 대표하는? A는 예를 들면 65 ASCII 코드는 AB, B는 66 ASCII 코드이다.
1) 용액 : AB 65 + 66 = 131으로 표현된다. 반대로 실시 예는 : BA가 다음과 같이 표현된다 (66) + 65 = 131, AB 및 BA가 동일하지 수 있고;
뺄셈, 곱셈, 추가 사용과 같다 문헌 2), 값이 고유하지 도시
3) 조립 : AB 그래서 정말 어떤 반례를 줄 수 없었다, 6566로 표시되어 있지만 디지털 값이 커질수록, 또한 그것은 6566 6 566 그것은 여부 돌아갈을 구분? 또는 6,56 6 그것? 문자열 같은 원래의 모습을 알고하지 않는 것 같습니다.
당연히, 우리는이 문제가 쉽게 밴드 회전하지라고 생각합니다. 문제가 발생하지 발생 덜 밴드의 종류 걸릴까요? 우리는 사건이 특정 될 수로 등 27,233,19260817을하는 경향이있다. (예는 나중에 설명 할 것이다).
때로는 오래 오래 부호의 범위를 벗어난 후, 그것을 어떻게 할까? 그래서 우리가 일반적으로 큰 소수 다이 방법 모듈을 사용합니다, 금형의 수는 문제의 데이터 크기를 볼 수는 얼마나이다.
어떤 경우는 3 % 2 = 1.5 = 1 (비유가 일반적으로 너무 작은되지 계수) 2 %, 소위됩니다 다루는 모듈 번호와 두 숫자로, 경우에 발생 해시 충돌 때 이러한 충돌을 줄이기 위해 질문 않습니다.
▎ 예 - 해시 문자열 [템플릿]
제목 설명
언급 한 바와 같이, 문자열 N 합계의 다른 스트링의 요구 갯수 (문자열 숫자, 대문자와 소문자, 대소 문자를 포함하는 미 문자열의 i 번째의 길이) N의 주어진 스트링.
입력 및 출력 형식
입력 형식 :
첫 번째 행은 정수 N 포함 스트링 수있다.
다음 N 라인 문자열 제공된 문자열을 포함한다.
출력 형식 :
스트링의 서로 다른 수의 정수를 포함하는 출력 라인을 포함하는 방법.
샘플 입출력
설명
시간의 제약 : 1000MS, 128M
데이터 규모 :
데이터의 30 % : N <= 10 Mi≈6, Mmax 순 <= 15;
데이터의 70 % : N <= 1000 Mi≈100, Mmax 순 <= 150
데이터의 100 % : N <= 10000 Mi≈1000, Mmax 순 <= 1,500
샘플 설명 :
제 샘플 스트링 (ABC)와 세 번째 문자열 (ABC)는 그 문자열 {AAAA, ABC, ABCC, 12345}의 세트를 구비하고, 동일하도록 네 개의 다른 캐릭터 총 .
이 질문은 완전히 템플릿 제목입니다 직접 잘 생각을 설정합니다.
▎Code은 말보다 더 크게 말한다!
말 수가 적은 사람이 직접 코드 (주의 사항 참조)했다
1 #INCLUDE <iostream> 2 #INCLUDE <알고리즘> 3 사용 스페이스 성병; 4 문자열 의; INT의 N; INT의 해시 [ 10000 ], 모드 = 19,270,817 , K = 30 , ANS = 1 ; 5 INT의 해시 ( 문자열 STR) 6 { 7 INT LEN = str.length (); 8 INT의 값 = 0 ; 도 9 에 대해 ( int로 I = 0 ; I <렌; 내가 ++ ) 10 * = 값 + K 값 (( INT ) STR [I] - 96 ); // 스위치 헥스 11. 리턴 값; // 여기서 실제로 금형 볼 수 있지만 너무 대규모 데이터 (12)이다 } 13는 INT ) (주 14 { 15 CIN >> N-, 16 대 ( INT I = 1. ; I <= N-; I ++는 ) 17. { 18 CIN >> S가, . 19 해쉬 [I]는 해시 (들) =; // 각 문자열 변환의 저장 후에 해시 값 20이다 } (21)은 정렬 (해시 + . 1해시 + N- +는 1이다. ); // 정렬이 목적은 캐릭터와 동일한 해시 값을 제외하는 22 인 를 들어 ( int로 I = 2 ; I <= N-; I는 ++ ) (23)는 IF ! (해쉬 [I]는 해쉬 [= I- . (1) ]) ANS ++; // 해시 값이 다른 경우, 캐릭터가 같은 두 아니다 24 COUT << ANS; 25 반환 0 ; 26이다 }
▎map은 무엇입니까?
이 질문에 대한 큰 무기 --map이 말을하는 것입니다. 간단한 소개 :
1) 헤더 : #INCLUDE <지도>
2) 정의 :지도 <유형, 유형> 변수 이름;
첫 번째 유형은 상기 타겟 어레이의 형태이며, 초 가변 타입의 값의 배열은
3) 사용 : 어떤 배열 첨자가 배열로 이해 될 수있는 정의를지도,이 효과는 아이디어를 시작하는 지금 그 질문을했다 정확하게
4) 밤나무 들어 예를 들어, 정수 배열 스트링들 배열 첨자이다 정의하면지도를 작성할 수 <문자열, INT> S;
어떻게 그냥 질문을 할까? 직접 일반 해시 그것에 댓글을 작성하지 않습니다.
1 #INCLUDE <iostream> 2 #INCLUDE <지도> 3 사용 스페이스 성병; 4 지도 < 문자열 , INT > S; 문자열 STR [ 100000 ]; int로 N, ANS; 5 INT 주 () 6 { 7 CIN >> N; (8) 에 대해 ( int로 I = 1 ; i가 N = <; 내가 ++ ) 9 { 10 CIN >> STR [I]; 11 S [STR [I] = 1 ; 12 } 13 위한 ( int로 I = 1 난 ++; 나는 <= N ) 14 { 15 의 경우 (S [STR [I]] == 1 ) 16 { 17 ++ ANS를 ; 18 S [STR [I] = 0 ; 19 } 20 } 21 COUT << ANS; 22 반환 0 ; 23 }
▎는 아니지만 전자의 방법으로지도 서 왜
지도는 배열처럼, 사실, 우리는 단순히지도를 매핑이 매우 느립니다, 단순히 폭력 쿼리 시간 복잡도이 상상할 수있는, 그리고 때로는 AC의 대상이 될 수 있지만, 가끔 만날 수없는, 좋은 보인다 피사체의 시간 요구 사항, 그것은 정직 문자열에서 그것의 해시입니다.