๋ฌธ์ ๊ฐ์: 5๊ฐ๋ก ๋ stack์ด ๋ค์ด์ด, ๋๊ฐ์ง method๊ฐ ์กด์ฌํจ
const int RA = (1<<20) - 1;int HL, H[120020], hash[120020];int spos[1<<20], visited[1<<20], mrk, ce;void reset() {HL = 0;++mrk, ce = 0;}// cur์ Hash์ ์ถ๊ฐํ๋ค.void append(int cur) {if(HL) {int prev = hash[HL - 1];hash[HL] = (prev << 5 | (cur - prev + 10)) & RA; // ํด์๊ฐ ๋ง๋ค๊ธฐ (ํด์๊ฐ ์๋์๋ค!?)// ํด์๊ฐ ์์ฑ ๋ก์ง์ด ๋์ํ๋ ์ด์// 1) cur - prev๋ ์ต๋ -10 ~ 10์ด ๋ ์ ์๋ค.// 2) ์ฌ๊ธฐ์ 10์ ๋ํ๋ฉด ์ต๋ 20// 3) bit๋ก ์ ํํ๋ฉด 5๋นํธ ์์ ๋ค์ด๊ฐ// 4) ์ด ๋ธ๋ก์๋ 5๊ฐ, ์ฐจ์ด๋ฅผ ๋ณด๋ฏ๋ก 4๊ฐ๋ฅผ ๋ณด๋ฉด ๋จ// 5) ์ฆ, ์ด 20bit// 6) 20bit๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ก ํ์ฐํ๋ฉด 2^20 ์ด๊ณ , ์ด๋ฆผ์ก์ 1MB๊ฐ ๋จ (2^10 = 1KB)if(HL >= 4) {visited[hash[HL]] = mrk; // visited ์ฒดํฌ์ฉ, ์ ๊ท๋ก ๋งค์นญ์ด ๊ฐ๋ฅํ๋ค๋ ํ์spos[hash[HL]] = ++ce; // 5๊ฐ์ง๋ฆฌ ์์ ์์น ์ ์ฅ}}H[HL++] = cur;}void addToRight(int mStack[]) {for(int i = 0; i < 5; i++) {append(mStack[i]);}}int matchStack(int mStack[]) {int v = 0;for(int i = 3; i >= 0; i--) {v = v << 5 | (mStack[i + 1] - mStack[i] + 10); // ํด์๊ฐ ๋ง๋ค๊ธฐ (ํด์๊ฐ ์๋์๋ค!?)}if(visited[v] != mrk) return -1; // ์ฌ๊ธฐ๊น์ง ์ด๋ฏธ ๋งค์นญ์ ํ๋จ์ด ์๋ฃ ๋จ// ์ด ์๋๋ ๋งค์นญ์ด ์๋ฃ๋์๋จ ๊ฒ ์ ์ ๋ก, ๋งค์นญ๋ ๋ถ๋ถ์ ์ ๊ฑฐํ๋ ๋ก์งint ansPos = spos[v]; // ์ด๊ฒ ๋ต์int oldEnd = HL;HL = ansPos - 1;// Hash๋ฅผ ๋ค์ ๊ตฌ์ฑํ๋ค. (์๊ฐ๋ณด๋ค ๋ค์ ๊ตฌ์ฑํ๋๋ฐ ์๊ฐ์ด ๊ธธ๊ฒ ๊ฑธ๋ฆฌ์ง๋ ์๋ ๋ฏ)++mrk;ce = 0;for(register int i = 4; i + 1 < ansPos; i++) {visited[hash[i]] = mrk;spos[hash[i]] = ++ce;}for(register int i = ansPos + 4; i < oldEnd; i++) {append(H[i]);}return x;}