Description
近日,園長發現動物園中好吃懶做的動物越來越多了。例如企鵝,只會賣萌向游客要吃的。為了整治動物園的不良風氣,讓動物們憑自己的真才實學向游客要吃的,園長決定開設算法班,讓動物們學習算法。
某天,園長給動物們講解KMP算法。
園長:“對于一個字符串S,它的長度為L。我們可以在O(L)的時間內,求出一個名為next的數組。有誰預習了next數組的含義嗎?”
熊貓:“對于字符串S的前i個字符構成的子串,既是它的后綴又是它的前綴的字符串中(它本身除外),最長的長度記作next[i]。”
園長:“非常好!那你能舉個例子嗎?”
熊貓:“例S為abcababc,則next[5]=2。因為S的前5個字符為abcab,ab既是它的后綴又是它的前綴,并且找不到一個更長的字符串滿足這個性質。同理,還可得出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,其中a和aa都滿足性質‘既是后綴又是前綴’,同時保證這個后綴與這個前綴不重疊。而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
aaaaa
ab
abcababc
Sample Output
1
32
HINT
?
n≤5,L≤1,000,000


#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; }
?