Codeforces 235C Cyclical Quest (后綴自動機)

題目鏈接: https://codeforces.com/contest/235/problem/C

題解:

對大串建后綴自動機

對詢問串復制拆環。這里一定要注意是復制一個循環節不是復制整個串!循環節是要整除的那種

然后要做的實際上是在大串上跑,每經過一個點求出當前的最長公共子串,如果大于等于\(n\)的話,則向上跳Parent樹找到\(n\in [minlen[v],maxlen[v]]\)的那個祖先\(v\)

這玩意直接做復雜度是錯的(雖然貌似網上有直接做過了的),但是我們可以遞推!

考慮遞推,實際上就是維護一個長度為\(m\)(詢問串長度)的隊列,每次刪掉第一個字符(就是判斷如果當前最長公共子串長\(=n\)就變成\(n-1\), 如果需要的話跳到父親),然后每次長度達到\(n\)\(ans+=len[u]\)即可。

代碼

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;const int N = 1e6;
const int S = 26;
char a[N+3];
char b[(N<<1)+3];
int son[(N<<1)+3][S+3];
int fa[(N<<1)+3];
int len[(N<<1)+3];
int vis[(N<<1)+3];
int ord[(N<<1)+3];
int buc[N+3];
int nxt[N+3];
int sz[(N<<1)+3];
int n,q,m,siz,rtn,lstpos;void initSAM()
{siz = rtn = lstpos = 1;
}void KMP()
{nxt[0] = nxt[1] = 0;for(int i=2; i<=m; i++){nxt[i] = nxt[i-1];while(nxt[i] && b[nxt[i]+1]!=b[i]){nxt[i] = nxt[nxt[i]];}if(b[nxt[i]+1]==b[i]) nxt[i]++;}
}void insertchar(char ch)
{int p = lstpos,np; siz++; np = lstpos = siz; len[np] = len[p]+1; sz[np]++;for(; p && son[p][ch]==0; p=fa[p]) {son[p][ch] = np;}if(p==0) {fa[np] = rtn;}else{int q = son[p][ch];if(len[q]==len[p]+1) {fa[np] = q;}else{siz++; int nq = siz; len[nq] = len[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));fa[nq] = fa[q]; fa[q] = fa[np] = nq;for(; p && son[p][ch]==q; p=fa[p]) {son[p][ch] = nq;}}}
}int main()
{initSAM();scanf("%s",a+1); n = strlen(a+1);for(int i=1; i<=n; i++) a[i]-=96;for(int i=1; i<=n; i++) {insertchar(a[i]);}for(int i=1; i<=siz; i++) buc[len[i]]++;for(int i=1; i<=n; i++) buc[i] += buc[i-1];for(int i=siz; i>=1; i--) ord[buc[len[i]]--] = i;for(int i=siz; i>=1; i--){int u = ord[i];sz[fa[u]] += sz[u];}scanf("%d",&q);while(q--){scanf("%s",b+1); m = strlen(b+1);for(int i=1; i<=m; i++) b[i]-=96;KMP();int cyclen = nxt[m];while(cyclen>0 && m%(m-cyclen)!=0){cyclen = nxt[cyclen];}cyclen = m-cyclen;for(int i=1; i<cyclen; i++) b[i+m] = b[i];int u = rtn,cur = 0,ans = 0;for(int i=1; i<m+cyclen; i++){while(u && son[u][b[i]]==0) {u = fa[u]; cur = len[u];}if(son[u][b[i]]!=0) {u = son[u][b[i]]; cur++;}else {u = rtn; cur = 0;}if(cur==m){ans += sz[u];cur--;if(cur<=len[fa[u]]){u = fa[u];}}}printf("%d\n",ans);}return 0;
}

轉載于:https://www.cnblogs.com/suncongbo/p/11070462.html

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

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

相關文章

泛型型協變逆變_Java泛型類型簡介:協變和逆變

泛型型協變逆變by Fabian Terh由Fabian Terh Java泛型類型簡介&#xff1a;協變和逆變 (An introduction to generic types in Java: covariance and contravariance) 種類 (Types) Java is a statically typed language, which means you must first declare a variable and …

安卓系統換成linux系統軟件,將舊安卓手機打造成“簡易linux”機器,并部署AdGuardHome...

從原教程的安裝Linux Deploy 完成后&#xff0c;在配置 Linux下載鏡像的一些東西時有些許出入。首先&#xff0c;我是用的下載源地址是 http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports 清華的源挺好用的。 其他有出入的配置如圖(記得把源地址改清華的&#xff0c;華中科大…

let與expr命令的用法與實戰案例

let命令的用法 格式&#xff1a; let 賦值表達式 【注】let賦值表達式功能等同于&#xff1a;&#xff08;賦值表達式&#xff09; 例子&#xff1a;給自變量i加8 12345678[rootXCN ~]# i2 [rootXCN ~]# let ii8 [rootXCN ~]# echo $i 10[rootXCN ~]# ii8 #去掉let定義 [root…

在使用ToolBar + AppBarLayout,實現上劃隱藏Toolbar功能,遇到了一個坑。

問題&#xff1a;Android5.0以下版本Toolbar不顯示沉浸式狀態欄&#xff0c;沒有這個問題&#xff0c;但是5.0以上版本&#xff0c;就出現了莫名其妙的陰影問題&#xff0c;很是頭疼。 分享一下我的解決方案&#xff1a; 在AppBarLayout中加一個屬性&#xff1a; app:elevation…

leetcode1476. 子矩形查詢

請你實現一個類 SubrectangleQueries &#xff0c;它的構造函數的參數是一個 rows x cols 的矩形&#xff08;這里用整數矩陣表示&#xff09;&#xff0c;并支持以下兩種操作&#xff1a; updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) 用 new…

msbuild構建步驟_如何按照以下步驟構建最終的AI聊天機器人

msbuild構建步驟by Paul Pinard保羅皮納德(Paul Pinard) 如何按照以下步驟構建最終的AI聊天機器人 (How to build the ultimate AI chatbot by following these steps) 快速指南&#xff0c;可幫助您避免常見的陷阱 (A quick guide that helps you avoid common pitfalls) Bui…

第一章:最小可行區塊鏈

概覽區塊數據結構區塊哈希創世塊創建區塊保存區塊鏈驗證區塊完整性選擇最長鏈節點間通信操作節點架構運行測試小結概覽 區塊鏈的基礎概念非常簡單, 說白了就是一個維護著一個持續增長的有序數據記錄列表的這么一個分布式數據庫。在此章節中我們將實現一個簡單的玩具版的區塊鏈。…

Oracle Controlfile控制文件中記錄的信息片段sections

初學Oracle的朋友肯定對Controlfile控制文件中到底記錄了何種的信息記錄而感到好奇&#xff0c;實際上我們可以通過一個視圖v$controlfile_record_section來了解控制文件的信息片段&#xff1a; SQL> select type, record_size, records_total from v$controlfile_record_s…

linux 怎么禁止遍歷目錄,linux下遍歷目錄功能實現

/*編譯:dir:dir.cgcc -o $ $<*/#include #include #include #include #include int do_search_dir(char *path);int do_check_dir(char *fullpath, char* truefullpath);void usage(char *apps);int count 0;intmain(int argc,char **argv){char fullpath[…

leetcode面試題 16.26. 計算器(棧)

給定一個包含正整數、加()、減(-)、乘(*)、除(/)的算數表達式(括號除外)&#xff0c;計算其結果。 表達式僅包含非負整數&#xff0c;&#xff0c; - &#xff0c;*&#xff0c;/ 四種運算符和空格 。 整數除法僅保留整數部分。 示例 1: 輸入: “32*2” 輸出: 7 代碼 clas…

團隊項目電梯會議視頻

http://v.youku.com/v_show/id_XMjcyMjI3Mjk2NA.html?spma2hzp.8244740.userfeed.5!2~5~5~5!3~5~A轉載于:https://www.cnblogs.com/jingxiaopu/p/6749776.html

arduino服務器_如何使用Arduino檢查Web服務器的響應狀態

arduino服務器by Harshita Arora通過Harshita Arora 如何使用Arduino檢查Web服務器的響應狀態 (How to use Arduino to check your web server’s response status) Last year, I created Crypto Price Tracker (an app which was acquired by Redwood City Ventures this yea…

leetcode486. 預測贏家(dp)

給定一個表示分數的非負整數數組。 玩家 1 從數組任意一端拿取一個分數&#xff0c;隨后玩家 2 繼續從剩余數組任意一端拿取分數&#xff0c;然后玩家 1 拿&#xff0c;…… 。每次一個玩家只能拿取一個分數&#xff0c;分數被拿取之后不再可取。直到沒有剩余分數可取時游戲結束…

linux怎么看文件狀態,linux查看文件類型-file、狀態-stat

linux查看文件類型-file、狀態-stat首頁 計算機相關 linux命令 linux查看文件類型-file、狀態-statfile 命令可以用來查看文件類型-i mime type-s 讀取字符或塊設備文件最好指定[root192 tmp]# file freeclsfreecls: UTF-8 Unicode text[root192 tmp]# file -i freeclsfreecls:…

Linux課程筆記 Crond介紹

1. 定時任務比較及cron語法 Linux的任務調度可以分為兩類&#xff1a; 系統自身執行的任務用戶執行的工作Linux系統下另外兩種定時任務軟件&#xff1a; at&#xff1a;適合僅執行一次的調度任務&#xff0c;需要啟動一個名為atd的服務 anacron&#xff1a;這個命令主要用于非…

Python 學習日記第二篇 -- 列表,元組

一、列表 列表是一個可以包含所以數據類型的對象的位置有序集合&#xff0c;它是可以改變的。 1、列表的序列操作&#xff08;Python3&#xff09; 123456789101112131415161718192021222324>>> one_list [1,2,3,4]>>> two_list ["jonny","…

【Gamma】PhyLab 測試報告

PhyLab Gamma測試報告 測試中發現的bug Gamma階段新Bug Bug可能原因部分錯誤碼設置與原先拋異常的邏輯沖突原先代碼中使用了一些特殊的辦法處理異常Beta未發現Bug Bug可能原因控制臺新建實驗編號不能以0開頭后端處理編號會將其前導0去除&#xff0c;以數字形式存儲&#xff0c;…

如何使用Node.js,Express和MongoDB設置GraphQL服務器

by Leonardo Maldonado萊昂納多馬爾多納多(Leonardo Maldonado) 如何使用Node.js&#xff0c;Express和MongoDB設置GraphQL服務器 (How to set up a GraphQL Server using Node.js, Express & MongoDB) 從GraphQL和MongoDB開始的最直接的方法。 (The most straightforward…

leetcode954. 二倍數對數組(treemap)

給定一個長度為偶數的整數數組 A&#xff0c;只有對 A 進行重組后可以滿足 “對于每個 0 < i < len(A) / 2&#xff0c;都有 A[2 * i 1] 2 * A[2 * i]” 時&#xff0c;返回 true&#xff1b;否則&#xff0c;返回 false。 示例 1&#xff1a; 輸入&#xff1a;[3,1,…

linux文件內容打印成二進制,如何在二進制文件中只打印可打印字符(相當于Linux下的字符串)?...

在Python3中&#xff0c;以二進制模式打開文件會得到bytes的結果。迭代一個bytes對象可以得到0到255(包括0到255)的整數&#xff0c;而不是字符。從^{} documentation&#xff1a;While bytes literals and representations are based on ASCII text, bytes objects actually b…