BZOJ3670: [Noi2014]動物園

Description

近日,園長發現動物園中好吃懶做的動物越來越多了。例如企鵝,只會賣萌向游客要吃的。為了整治動物園的不良風氣,讓動物們憑自己的真才實學向游客要吃的,園長決定開設算法班,讓動物們學習算法。

某天,園長給動物們講解KMP算法。

園長:“對于一個字符串S,它的長度為L。我們可以在O(L)的時間內,求出一個名為next的數組。有誰預習了next數組的含義嗎?”

熊貓:“對于字符串S的前i個字符構成的子串,既是它的后綴又是它的前綴的字符串中(它本身除外),最長的長度記作next[i]。”

園長:“非常好!那你能舉個例子嗎?”

熊貓:“例S為abcababc,則next[5]=2。因為S的前5個字符為abcabab既是它的后綴又是它的前綴,并且找不到一個更長的字符串滿足這個性質。同理,還可得出next[1] = next[2] = next[3] = 0,next[4] = next[6] = 1,next[7] = 2,next[8] = 3。”

園長表揚了認真預習的熊貓同學。隨后,他詳細講解了如何在O(L)的時間內求出next數組。

下課前,園長提出了一個問題:“KMP算法只能求出next數組。我現在希望求出一個更強大num數組一一對于字符串S的前i個字符構成的子串,既是它的后綴同時又是它的前綴,并且該后綴與該前綴不重疊,將這種字符串的數量記作num[i]。例如S為aaaaa,則num[4] = 2。這是因為S的前4個字符為aaaa,其中aaa都滿足性質‘既是后綴又是前綴’,同時保證這個后綴與這個前綴不重疊。而aaa雖然滿足性質‘既是后綴又是前綴’,但遺憾的是這個后綴與這個前綴重疊了,所以不能計算在內。同理,num[1] = 0,num[2] = num[3] = 1,num[5] = 2。”

最后,園長給出了獎勵條件,第一個做對的同學獎勵巧克力一盒。聽了這句話,睡了一節課的企鵝立刻就醒過來了!但企鵝并不會做這道題,于是向參觀動物園的你尋求幫助。你能否幫助企鵝寫一個程序求出num數組呢?

特別地,為了避免大量的輸出,你不需要輸出num[i]分別是多少,你只需要輸出1,000,000,007取模的結果即可。

Input

第1行僅包含一個正整數n ,表示測試數據的組數。隨后n行,每行描述一組測試數據。每組測試數據僅含有一個字符串S,S的定義詳見題目描述。數據保證S 中僅含小寫字母。輸入文件中不會包含多余的空行,行末不會存在多余的空格。

Output

包含 n 行,每行描述一組測試數據的答案,答案的順序應與輸入數據的順序保持一致。對于每組測試數據,僅需要輸出一個整數,表示這組測試數據的答案對 1,000,000,007 取模的結果。輸出文件中不應包含多余的空行。

Sample Input

3
aaaaa
ab
abcababc

Sample Output

36
1
32

HINT

?

n≤5,L≤1,000,000

將KMP算法中的next[i]向i連一條邊,得到KMP樹。
那么num[i]其實就是i沿KMP樹向上第一個長度<=i/2的節點在KMP樹上的深度。
那么我們在KMP的時候再維護一下那個節點就行了。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;
}
const int maxn=1000010;
const int mod=1000000007;
char s[maxn];
int f[maxn],dep[maxn];
int main() {dwn(T,read(),1) {scanf("%s",s);int n=strlen(s);f[1]=f[0]=0;dep[1]=1;int j=0,j2=0;long long ans=1;rep(i,1,n-1) {while(j&&s[i]!=s[j]) j=f[j];if(s[i]==s[j]) j++;f[i+1]=j;dep[i+1]=dep[j]+1;while(j2&&s[i]!=s[j2]) j2=f[j2];if(s[i]==s[j2]) j2++;while(j2>i+1>>1) j2=f[j2];(ans*=dep[j2]+1)%=mod;}printf("%lld\n",ans);}return 0;
}
View Code

?

轉載于:https://www.cnblogs.com/wzj-is-a-juruo/p/5051676.html

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

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

相關文章

NSPredicate的用法、數組去重、比較...

一般來說這種情況還是蠻多的&#xff0c;比如你從文件中讀入了一個array1&#xff0c;然后想把程序中的一個array2中符合array1中內容的元素過濾出來。 1&#xff09;例子一&#xff0c;一個循環 NSArray *arrayFilter [NSArray arrayWithObjects:"pict", "bla…

android one指紋解鎖,小米用屏幕內指紋掃描儀準備了兩部Android One手機

2017年9月發布時&#xff0c;小米米A1幾乎成功一夜成名。小西米去年夏天推出了Mi A2和Mi A2 Lite。現在&#xff0c;正如XDA開發者所揭示的那樣&#xff0c;中國品牌正在籌備第三代產品陣容。代號為“bamboo_sprout”和“cosmos_sprout” - 所有Android One智能手機都包含代號為…

hive日志位置(日志定位報錯:Failed with exception Unable to move sourcehdfs://namenode/tmp/hive-pmp_bi/h)...

Hive中的日志分為兩種 1. 系統日志&#xff0c;記錄了hive的運行情況&#xff0c;錯誤狀況。 2. Job 日志&#xff0c;記錄了Hive 中job的執行的歷史過程。日志查看方法 1&#xff0c;在本地運行機器上 hive日志存儲位置在本機上&#xff0c;不是hadoop上&#xff1a;在hive/co…

控制算法用c語言實現的,PID控制算法的C語言實現(完整版)

【實例簡介】該文件里面還有各種改進的PID的算法&#xff0c;比如變積分控制等【實例截圖】【核心代碼】具體 PID 實現代碼如下&#xff1a;pid.Kp0.4;pid.Ki0.2;//增加了積分系數pid.Kd0.2;float PID_realize(float speed){float index;pid.SetSpeedspeed;pid.errpid.SetSpeed…

《挑戰程序設計競賽》2.2 貪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262

POJ3617 Best Cow Line 題意 給定長度為N的字符串S&#xff0c;要構造一個長度為N的字符串T。起初&#xff0c;T是一個空串&#xff0c;隨后反復進行下列任意操作&#xff1a; 從S的頭部&#xff08;或尾部&#xff09;刪除一個字符&#xff0c;加到T的尾部 目標是構造字典序…

easyui dialog的一個小坑

問題描述&#xff1a;1、html<div id"dig" style"padding:10px;width:500px;height:300px;font-family:微軟雅黑;font-size:16px;"> Dialog Content. </div> 2、js$("#dig").css("display", "block");$(#dig).d…

android rxbus 一個頁面監聽,Android RxBus的使用

RxBus的核心功能是基于Rxjava的&#xff0c;在RxJava中有個Subject類&#xff0c;它繼承Observable類&#xff0c;同時實現了Observer接口&#xff0c;因此Subject可以同時擔當訂閱者和被訂閱者的角色&#xff0c;這里我們使用Subject的子類PublishSubject來創建一個Subject對象…

AngularJS $q

updatePushIdfunction($q,pushid) { var d$q.defer(); var data {pushid:pushid}; server.api("/updateRId",data).success(function(res){ if(res.resultcode1){ d.resolve(更新成功.);…

C# 如何轉換生成長整型的時間

這個數字字符串就是我們平常所說的時間戳。什么是時間戳&#xff1f;時間戳&#xff08;timestamp&#xff09;&#xff0c;通常是一個字符序列&#xff0c;唯一地標識某一刻的時間。時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至…

html自動滑動輪播代碼,html+css+js 實現自動滑動輪播圖

輪播圖*{margin: 0 auto;padding: 0;list-style: none; //去圓點}.one {width: 1200px;height:350px;margin: 0 auto;overflow: hidden; //設定好的寬度多余的進行隱藏}.one ul{width: 3600px;position: relative;}.one ul li{float: left; //圖片浮動}.two ul li { …

程序員必定會愛上的10款軟件

目錄 第一款&#xff1a;TrueCrypt 第二款&#xff1a;Soureinsight 第三款&#xff1a;Sublime 第四款&#xff1a;Mindmanager 第五款&#xff1a;MarkdownPad 第六款&#xff1a;Beyond compare 第七款&#xff1a;Vim 第八款&#xff1a;Wireshark 第九款&#xff1a;Fiddl…

html定義字體縱向對齊,HTML5 Canvas的文本如何實現垂直對齊

垂直對齊&#xff0c;使用CSS很容易實現&#xff0c;如果想在HTML5 Canvas中實現垂直對齊&#xff0c;如何設置呢&#xff0c;這就是今天要分享的筆記。HTML畫布垂直對齊的文本&#xff0c;我們可以使用的textBaseline在畫布范圍內的屬性值。textBaseline可以設置以下值之一 &a…

深度學習方法:受限玻爾茲曼機RBM(三)模型求解,Gibbs sampling

歡迎轉載&#xff0c;轉載請注明&#xff1a;本文出自Bin的專欄blog.csdn.net/xbinworld。 技術交流QQ群&#xff1a;433250724&#xff0c;歡迎對算法、技術、應用感興趣的同學加入。 接下來重點講一下RBM模型求解方法&#xff0c;其實用的依然是梯度優化方法&#xff0c;但是…

推薦一款PC端的遠程軟件-Remote Utilities

遠程控制軟件非常之多&#xff0c;但小編自己用過的就那么3個&#xff1a;teamviewer&#xff1a;在家遠程辦公時基本上都靠它連回公司的電腦&#xff0c;速度快、穩定、不需要公網IP。vnc&#xff1a;要開啟vpn才能連回公司的網絡&#xff0c;速度夠快。系統自帶遠程桌面&…

原生js追加html代碼,原生js實現給指定元素的后面追加內容

復制代碼 代碼如下:var header1 document.getElementById("header");var p document.createElement("p"); // 創建一個元素節點insertAfter(p,header1); // 因為js沒有直接追加到指定元素后面的方法 所以要自己創建一個方法function insertAfter( newEle…

這些才是Win10真正好用之處:瞬對Win7無愛

自從將家里的筆電、臺式機全部升級到Win10之后&#xff0c;小編可是切切實實感受到了它的強大&#xff0c;非常多的改進、非常多人性化的設計。和之前的測試版不同&#xff0c;作為主力系統后自然要匹配日常的工作。很多設置、操作也要順應以前的使用習慣。經過這幾天折騰&…

html5 保存 搜索歷史,html5 – 如何有效處理Dart中的瀏覽器歷史記錄(即后退按鈕)?...

HTML5定義了用于操作歷史記錄的新API,允許您在不重新加載窗口的情況下更改位置.有一篇關于Dive Into HTML5的精彩文章,展示了如何使用歷史API在單頁面應用中模擬多頁面導航.它很容易翻譯成Dart.在帶導航的單頁應用程序中,我通常設置客戶端代碼的方式類似于在服務器上設置RoR或D…

多個DataSet數據合并

DataSet ds myIAppSet.GetHomeHottestList(siteID, 0, time); DataSet ds1 myIAppSet.GetHomeHottestList(siteID, 1, time);if (ds1 ! null && ds1.Tables[0].Rows.Count > 0){ds.Merge(ds1);} Merge方法&#xff0c;用于DataSet、DataTable&#xff0c;多個字段…

math.js:靈活強大的JavaScript數學庫

最近為期權開發一些基本技術指標&#xff0c;用到一些C的數學庫&#xff0c;剛好看到JavaScript的math.js庫&#xff0c;這里對math.js做一下簡單介紹。一、什么是math.jsmath.js是一個廣泛應用于JavaScript 和 Node.js的數學庫&#xff0c;它的特點是靈活表達式解析器&#xf…

html的閃爍字,HTML最簡單的文字閃爍代碼

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓Titlekeyframes blink{0%{opacity: 1;}50%{opacity: 1;}50.01%{opacity: 0;}100%{opacity: 0;}}-webkit-keyframes blink {0% { opacity: 1; }50% { opacity: 1; }50.01% { opacity: 0; }100% { opacity: 0; }}-moz-keyframes blin…