spoj SUBLEX (Lexicographical Substring Search) RE的歡迎來看看

SPOJ.com - Problem SUBLEX

  這么裸的一個SAM,放在了死破OJ上面就是個坑。

注意用SAM做的時候輸出要用一個數組存下來,然后再puts,不然一個一個字符輸出會更慢。

還有一個就是不要多數據輸入,估計最后多了幾個沒用的數字,反正我這么做一直無端端的RE。(就這樣浪費了我一天好么!出數據的人這么不負責!)

最后就是,第k大的k是會超過子串數的。(這什么腦殘配置?)

  綜上,這題除了坑就是坑。

?

代碼如下:

?

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 const int N = 222222;
  5 const int LAST = 90000;
  6 const int K = 26;
  7 
  8 struct Node {
  9     Node *nx[K], *fail;
 10     int dist;
 11     long long sub;
 12 
 13     void Clear(const int d = 0) {
 14         memset(nx, 0, sizeof nx);
 15         fail = 0;
 16         dist = d;
 17         sub = 0;
 18     }
 19 } ;
 20 
 21 struct SAM {
 22     Node node[N << 1];
 23     Node *root, *last;
 24     int ttNode;
 25 
 26     Node *Mem(const int d = 0) {
 27         Node *temp = node + ttNode++;
 28 
 29         temp->Clear(d);
 30 
 31         return temp;
 32     }
 33 
 34     void Clear() {
 35         ttNode = 0;
 36         root = last = Mem();
 37     }
 38 
 39     void Expand(const char c) {
 40         const int idx = c - 'a';
 41         Node *p = last, *np = Mem(p->dist + 1);
 42 
 43         for ( ; p && p->nx[idx] == 0; p = p->fail) {
 44             p->nx[idx] = np;
 45         }
 46         if (p) {
 47             Node *q = p->nx[idx];
 48 
 49             if (p->dist + 1 != q->dist) {
 50                 Node *nq = Mem();
 51 
 52                 *nq = *q;
 53                 nq->dist = p->dist + 1;
 54                 q->fail = np->fail = nq;
 55                 for ( ; p && p->nx[idx] == q; p = p->fail) {
 56                     p->nx[idx] = nq;
 57                 }
 58             } else {
 59                 np->fail = q;
 60             }
 61         } else {
 62             np->fail = root;
 63         }
 64         last = np;
 65     }
 66 
 67     int dist[N << 1];
 68     Node *ptr[N << 1];
 69 
 70     void GetSub() {
 71         memset(dist, 0, sizeof dist);
 72         for (int i = 0; i < ttNode; ++i) {
 73             ++dist[node[i].dist];
 74         }
 75         for (int i = 1; i < ttNode; ++i) {
 76             dist[i] += dist[i - 1];
 77         }
 78         for (int i = 0; i < ttNode; ++i) {
 79             ptr[--dist[node[i].dist]] = node + i;
 80         }
 81         for (int i = ttNode - 1; i >= 0; --i) {
 82             Node *p = ptr[i];
 83 
 84             p->sub = 1;
 85             for (int j = 0; j < K; ++j) {
 86                 if (p->nx[j]) {
 87                     p->sub += p->nx[j]->sub;
 88                 }
 89             }
 90         }
 91         --node[0].sub;
 92         //for (int i = 0; i < ttNode; ++i) { cout << node[i].dist << ' '; } cout << endl;
 93         //for (int i = 0; i < ttNode; ++i) { cout << node[i].sub << ' '; } cout << endl;
 94         //for (int i = 0; i < ttNode; ++i) { cout << i << ": "; for (int j = 0; j < K; ++j) { cout << (node[i].nx[j] ? node[i].nx[j] - node : -1) << ' '; } cout << endl; }
 95     }
 96 } sam;
 97 
 98 char s[N], answer[N];
 99 
100 void Generate(char *const s) {
101     srand(time(0));
102     for (int i = 0; i < LAST; ++i) {
103         s[i] = rand() % 26 + 'a';
104     }
105     s[LAST] = 0;
106 }
107 
108 int Run() {
109     //while (~scanf("%s", s)) {
110     //while (1) {
111         //Generate(s);
112         scanf("%s", s);
113         sam.Clear();
114         for (int i = 0; s[i]; ++i) {
115             sam.Expand(s[i]);
116         }
117         sam.GetSub();
118         //cout << sam.root->sub << endl;
119         //if (sam.ttNode >= (N << 1)) { puts("???"); while (1) ; }
120 
121         int n, k;
122 
123         scanf("%d", &n);
124         while (n--) {
125             Node *p = sam.root;
126             int pos = 0;
127 
128             scanf("%d", &k);
129             //if (k > sam.root->sub) { puts("..."); while (1) ; }
130             k = (k - 1) % sam.root->sub + 1;
131             while (k > 0) {
132                 for (int i = 0; i < K; ++i) {
133                     if (p->nx[i] == 0) {
134                         continue;
135                     }
136 
137                     const int cnt = p->nx[i]->sub;
138 
139                     if (cnt >= k) {
140                         //putchar('a' + i);
141                         answer[pos++] = 'a' + i;
142                         p = p->nx[i];
143                         --k;
144                         break;
145                     } else {
146                         k -= cnt;
147                     }
148                 }
149             }
150             answer[pos] = 0;
151             puts(answer);
152             //puts("");
153         }
154     //}
155 
156     return 0;
157 }
158 
159 int main() {
160     //ios::sync_with_stdio(0);
161     return Run();
162 }
View Code

?

UPD:還有更坑的,我開99999 * 2的SAM節點數是會TLE的,開222222 * 2才AC。我猜肯定是新增的數據各種問題,數據不在范圍內了。

?

——written by LyonLys

轉載于:https://www.cnblogs.com/LyonLys/p/spoj_sublex.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mt4雙線macd_3年內從虧損90多萬到獲利近760萬,我只堅持我的:60分鐘MACD雙回拉戰法!附選股公式...

MACD指標被普遍認為是最經典實用的技術指標之一。其實并不是因為MACD有多么精妙的算法&#xff0c;而是MACD遵循了最基本的“均線指導原則”&#xff0c;形象的將經典雙均線系統換了一種更加直觀的表達方式。在MT4中&#xff0c;默認應用的是單線MACD指標&#xff0c;而在證券市…

計算機專業書籍速讀方法,格式你玩的轉?速讀5分鐘就懂

小編又接到了新問題&#xff0c;有小伙伴說自己64GB的U盤在電腦里格式化只能選ExFAT或者NTFS&#xff0c;不能選擇FAT32&#xff0c;求小編解答&#xff0c;小編正好借著這個機會&#xff0c;說說現在電腦格式問題。如果你懶得讀&#xff0c;↓↓↓最后一段有答案&#xff0c;如…

java項目打jar包

http://www.cnblogs.com/tianguook/archive/2012/03/14/2396335.html java項目打jar包分為2種情況&#xff1a; 一、java項目沒有導入第三方jar包 這時候打包就比較簡單&#xff1a; 1. 首先在Eclipse中打開項目&#xff0c; 右鍵點擊項目&#xff0c;選擇“Export”&#xff1…

第一天 :學習node.js

第一天 &#xff1a;學習node.js ① node.js環境配置 我學過的語言最簡單的一門 直接百度就可以配置 ② 每個入門 的程序都是從helloworld開始 代碼如下 &#xff1a; var httprequire(http); http.createServer(function(req,res){ res.writeHead(200,{content-type:text/htm…

c語言從入門到精通第四版電子書_C語言從入門到精通(吐血分享)4.pdf

C語言從入門到精通(吐血分享)4成功&#xff01;結構體、鏈表、文件數組、字符串函數、指針三種結構化程序設計三種數據類型、六大表達式一、簡單的程序#include 數學函數 命令行main() /*主函數*/{ /*左花括號&#xff0c;函數體的開始 */int a,b,c; /*定義語句*/a 3; /*執行語…

從硬盤上把數據傳回到計算機稱為什么,計算機基礎知識 第一章 習題三

計算機基礎知識第一章習題三一、填空題1. 高級語言不能直接被計算機識別并執行&#xff0c;必須翻譯成機器語言&#xff0c;翻譯的方式有兩種&#xff1a;一種是編譯方式&#xff0c;另一種是方式。2. 計算機中存儲數據的最小單位是&#xff1b;存儲容量的基本單位是。3. CAI的…

Mentor PADS 9.5下載安裝及破解指南

Pads&#xff0c;是一款用于設計、模擬電子線路及設計電路板的電腦軟件&#xff0c;原由Innoveda公司開發&#xff0c;其后改名為PowerPCB&#xff0c;在2002年4月Innoveda被Mentor Graphics收購&#xff0c;近年再次改用原名Pads。目前該軟件是國內從事電路設計的工程師和技術…

Thymeleaf 學習筆記 (4)~~~~

2019獨角獸企業重金招聘Python工程師標準>>> 模板布局 模板布局主要用到的標記有這么幾個&#xff1a; th:fragment &#xff0c;用來定義片段的&#xff0c;用法&#xff1a;th:fragment"fragmentName"&#xff0c;起一個名字方便被其他地方引用&#xf…

憑證 金蝶_金蝶軟件賬務處理流程之——憑證錄入

金蝶是我們財務人非常熟悉的財務軟件&#xff0c;但是我們很多財務人只在應用軟件的時候還是會出現很多的問題&#xff0c;為了幫助大家更好地應用這個軟件&#xff0c;小編今天就來和大家講講關于金蝶軟件憑證查詢環節的一些基本處理流程。點擊主界面“憑證查詢”→彈出憑證過…

計算機網申興趣愛好怎么寫,銀行網申個人特長和興趣愛好怎么寫

銀行網申個人特長和興趣愛好怎么寫銀行網申中個人簡歷及興趣愛好怎么寫?下面jyj135小編為大家整理了銀行網申中個人特長和興趣愛好的寫作技巧&#xff0c;希望能為大家提供幫助!銀行網申特長及興趣愛好怎么寫?特長Strong Point(1)寫強項。弱項一定不要寫&#xff0c;面試人員…

單例模式討論篇:單例模式與垃圾回收

出處&#xff1a;http://blog.csdn.net/zhengzhb/article/details/7331354 Jvm的垃圾回收機制到底會不會回收掉長時間不用的單例模式對象&#xff0c;這的確是一個比較有爭議性的問題。將這一部分內容單獨成篇的目的也是為了與廣大博友廣泛的討論一下這個問題。為了能讓更多的人…

inline關鍵字

本文介紹了GCC和C99標準中inline使用上的不同之處。inline屬性在使用的時候&#xff0c;要注意以下兩點&#xff1a;inline關鍵字在GCC參考文檔中僅有對其使用在函數定義&#xff08;Definition&#xff09;上的描述&#xff0c;而沒有提到其是否能用于函數聲明&#xff08;Dec…

springmvc 組合注解

組合注解的意思就是一個注解中包含多個注解。在springmvc 的RestController中&#xff0c;你就可發現. Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Controller ResponseBody public interface RestController {/*** The value may indicate a su…

人才管理是什么意思_上海托管倉庫外包倉庫管理什么意思

上海托管倉庫外包倉庫管理什么意思上海倉庫托管外包。好的上海倉庫托管是預估好自己的貨物總計有多少個方。車子的體積有多少&#xff0c;然后估算出總計需要多少車需要多少錢&#xff0c;需要怎么裝車、卸貨碼放方式是什么樣的&#xff0c;算出總的費用然后包干給搬家公司。這…

window server 安裝與卸載

安裝window server 程序:C:\Windows\Microsoft.NET\Framework\v2.0.50727\installutil DataUpdateService.exe net start LuceneServer 卸載window server 程序:net stop LuceneServer C:\Windows\Microsoft.NET\Framework\v2.0.50727\installutil /U DataUpdateService.exe …

Makefile學習(二)[第二版]

復雜實例#示例1:在上一個示例的基礎上再增加一個可執行文件03test[修改之處已標紅].PHONY: clean all CC gcc CFLAGS -Wall -gBIN 01test 02test 03testSOURCES $(BIN:.c)OBJECTS $(BIN:.o)all: $(BIN)01test: 01test.o02test: 02test.o03test: 03test.o.c.o:$(CC) $(CFLA…

計算機網絡asp視頻教程,輕輕松松學編程!ASP互動視頻教程

從2006年5月18日開始&#xff0c;PConline將與FIF聯合推出國內網上第一部互動視頻教程&#xff1a;《ASP互動視頻教程》。它預示著一個全新的自助學習時代的到來。盡管相較于傳統的圖文教程&#xff0c;以前的多媒體視頻課件優點非常明顯&#xff0c;但它仍然存在交互性差的缺點…

Oracle查詢和解鎖表

一些ORACLE中的進程被殺掉后&#xff0c;狀態被置為"killed"&#xff0c;但是鎖定的資源很長時間不釋放&#xff0c;有時實在沒辦法&#xff0c;只好重啟數據庫。現在提供一種方法解決這種問題&#xff0c;那就是在ORACLE中殺不掉的&#xff0c;在OS一級再殺。1.下面…

三維家可以導入別人的方案嗎_廣州深圳天津形位公差檢測三維缺陷檢測服務

形位公差檢測三維缺陷檢測服務標簽&#xff1a;形位公差檢測 三維缺陷檢測服務 三維缺陷檢測鑄造工藝是一種經濟實惠的毛坯成形方式&#xff0c;對于一些形狀復雜的零件更能顯示出它的經濟性。比如汽車發動機的缸體和缸蓋&#xff0c;船舶螺旋槳以及精致的藝術品等。本期案例的…

計算機缺失esul.dll,SceneUI.ES.dll

我該如何安裝從金山毒霸下載的DLL文件&#xff1f;一&#xff1a;1、從金山毒霸下載壓縮文件。2、將DLL文件解壓到電腦上的某個地方。3、把該文件跟要求使用它的程序放在同一路徑上。注意32位程序需要使用32位的DLL文件&#xff0c;64位程序需要使用64位的DLL文件。否則會出現0…