#互動,棧#LOJ 3005 「JOISC 2015 Day 4」Limited Memory
阿新 • • 發佈:2021-07-21
互動,棧
分析
一開始想的是棧的匹配,但是位數不夠,而且還忘記寫memory.h,
考慮它詢問次數不超過一萬五千次,\(O(n^2)\)的詢問是綽綽有餘的,
如果每一個符號都能被匹配那整個串也能被匹配,而中間的符號怎麼樣可以忽略,只需要棧為空時兩端相等即可
那麼考慮維護當前需要匹配的點、當前位置、需要匹配點是什麼型別的符號以及棧的大小,正好用二進位制壓成22位
程式碼
#include "memory.h" int Get_Hash(int is_bracket,int Top,int x,int now){ return is_bracket|(Top<<1)|(x<<8)|(now<<15); } int Memory(int N, int M) { int is_bracket=M&1,Top=(M>>1)&127,x=(M>>8)&127,now=(M>>15)&127; if (!x) return Get_Hash(0,0,1,1); if (x>N) return -1; else if (now<1||now>N) return -2; char ch=Get(now); if (x==now){ if (ch=='<'||ch=='[') return Get_Hash(ch=='[',1,x,now+1); else return Get_Hash(ch==']',1,x,now-1); }else if (x<now){ if (ch=='>'||ch==']') --Top; else ++Top; if (!Top&&!(is_bracket^(ch=='>'))) return -2; else if (!Top) return Get_Hash(0,0,x+1,x+1); return Get_Hash(is_bracket,Top,x,now+1); }else{ if (ch=='<'||ch=='[') --Top; else ++Top; if (!Top&&!(is_bracket^(ch=='<'))) return -2; else if (!Top) return Get_Hash(0,0,x+1,x+1); return Get_Hash(is_bracket,Top,x,now-1); } }