SPOJ7258 SUBLEX - Lexicographical Substring Search
生活随笔
收集整理的這篇文章主要介紹了
SPOJ7258 SUBLEX - Lexicographical Substring Search
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
傳送門[洛谷]
心態(tài)崩了我有妹子
靠 我寫的記憶化搜索 莫名WA了 然后心態(tài)崩了
當(dāng)我正要改成bfs排序的時(shí)候 我靈光一動(dòng) md我寫的i=0;i<25;i++???
然后 改過(guò)來(lái)就A掉了T^T
大體做法就是 一個(gè)點(diǎn)出發(fā)的本質(zhì)不同子串?dāng)?shù)量應(yīng)該是就是所有添加字符的轉(zhuǎn)移和其余選一個(gè)空串的轉(zhuǎn)移
所以直接建出自動(dòng)機(jī)然后 我的做法是直接記憶化搜索就可以省去建樹/排序 因?yàn)樗凶哟囟ㄓ赊D(zhuǎn)移構(gòu)成 所以可以直接記憶化
附代碼。(我覺得這個(gè)做法巨強(qiáng)無(wú)比)
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 20021225 #define ll long long #define mxn 90010 using namespace std;struct node{int ch[26],fa,len,f;}t[mxn*4]; int poi,cnt,lt,rt;char ch[mxn]; int id(char c){return c-'a';} void insert(int c) {int p=lt,np=lt=++poi; t[np].len=t[p].len+1;for(;p&&!t[p].ch[c];p=t[p].fa) t[p].ch[c]=np;if(!p){t[np].fa=rt;return;}int q=t[p].ch[c];if(t[q].len==t[p].len+1){t[np].fa=q;return;}int nq=++poi; t[nq].len=t[p].len+1;memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch));t[nq].fa=t[q].fa; t[q].fa=t[np].fa=nq;for(;p&&t[p].ch[c]==q;p=t[p].fa) t[p].ch[c]=nq; } int query(int x) {if(~t[x].f) return t[x].f;t[x].f=1;for(int i=0;i<26;i++)if(t[x].ch[i])t[x].f+=query(t[x].ch[i]);return t[x].f; } int n; void getans(int pos,int k) {if(!k) return;for(int i=0;i<26;i++)if(t[pos].ch[i]){if(t[t[pos].ch[i]].f<k) k-=t[t[pos].ch[i]].f;else{ch[++n]=i+'a';getans(t[pos].ch[i],k-1);break;}} } int main() {scanf("%s",ch+1);n=strlen(ch+1);rt=lt=++poi;for(int i=1;i<=n;i++) insert(id(ch[i]));for(int i=1;i<=poi;i++) t[i].f=-1;query(rt);//for(int i=1;i<=poi;i++) printf("%d\n",t[i].f);int T;scanf("%d",&T);while(T--){for(int i=1;i<=n;i++) ch[i]=0;int k;scanf("%d",&k);n=0;getans(rt,k);for(int i=1;i<=n;i++) printf("%c",ch[i]);printf("\n");}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的SPOJ7258 SUBLEX - Lexicographical Substring Search的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql utl_file_利用UTL
- 下一篇: Hugepages详解