UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 1.36 kB
export class Trie{#t;#e;#s;#r;#i;#o;#h;constructor(t){this.#e=0,this.#h=t,this.clear()}static newStringTrie(){return new Trie({empty:()=>"",append:(t,e)=>t+e,slice:(t,e,s)=>t.slice(e,s)})}static newArrayTrie(){return new Trie({empty:()=>[],append:(t,e)=>t.concat([e]),slice:(t,e,s)=>t.slice(e,s)})}add(t){let e=this.#e;++this.#i[this.#e];for(let s=0;s<t.length;++s){const r=t[s];let i=this.#s[e].get(r);i||(this.#o.length?i=this.#o.pop():(i=this.#t++,this.#r.push(!1),this.#i.push(0),this.#s.push(new Map)),this.#s[e].set(r,i)),++this.#i[i],e=i}this.#r[e]=!0}remove(t){if(!this.has(t))return!1;let e=this.#e;--this.#i[this.#e];for(let s=0;s<t.length;++s){const r=t[s],i=this.#s[e].get(r);--this.#i[i]||(this.#s[e].delete(r),this.#o.push(i)),e=i}return this.#r[e]=!1,!0}has(t){let e=this.#e;for(let s=0;s<t.length;++s)if(e=this.#s[e].get(t[s]),!e)return!1;return this.#r[e]}words(t){t=t??this.#h.empty();let e=this.#e;for(let s=0;s<t.length;++s)if(e=this.#s[e].get(t[s]),!e)return[];const s=[];return this.dfs(e,t,s),s}dfs(t,e,s){this.#r[t]&&s.push(e);const r=this.#s[t];for(const[t,i]of r){const r=this.#h.append(e,t);this.dfs(i,r,s)}}longestPrefix(t,e){let s=this.#e,r=0;for(let i=0;i<t.length&&(s=this.#s[s].get(t[i]),s);++i)e&&!this.#r[s]||(r=i+1);return this.#h.slice(t,0,r)}clear(){this.#t=1,this.#e=0,this.#s=[new Map],this.#r=[!1],this.#i=[0],this.#o=[]}}