#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x=1,sum=0;
char ch;
ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')x=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
sum=(sum<<3)+(sum<<1)+(ch^48);
ch=getchar();
}
return x*sum;
}
const int N=1e6+10,mod=1e9+7;
int t,nx[N],ans=1,p,cnt,num[N];
string s,k;
inline void getNext(string s,int sl){
nx[0]=nx[1]=0;
int j;
for(int i=1;i<sl;i++){
j=nx[i];
while(j&&s[i]!=s[j])j=nx[j];
if(s[i]==s[j])j++;
nx[i+1]=j;
num[i+1]=num[j]+1;//不同处
}
}
inline void work(string s){
for(int i=1,j=0;i<s.size();i++){
while(j&&s[i]!=s[j])j=nx[j];
if(s[i]==s[j])j++;
while(j>(i+1)/2)j=nx[j];
ans=(ans*(num[j]+1))%mod;
}
cout<<ans<<endl;
}
signed main(){
t=read();
num[1]=1;
while(t--){
cin>>s;
ans=1;
getNext(s,s.size());
work(s);
}
return 0;
}
和下面的代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x=1,sum=0;
char ch;
ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')x=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
sum=(sum<<3)+(sum<<1)+(ch^48);
ch=getchar();
}
return x*sum;
}
const int N=1e6+10,mod=1e9+7;
int t,nx[N],ans=1,p,cnt,num[N];
string s,k;
inline void getNext(string s,int sl){
nx[0]=nx[1]=0;
int j;
for(int i=1;i<sl;i++){
j=nx[i];
while(j&&s[i]!=s[j])j=nx[j];
if(s[i]==s[j])j++;
nx[i+1]=j;
}
}
inline void work(string s){
for(int i=1,j=0;i<s.size();i++){
while(j&&s[i]!=s[j])j=nx[j];
if(s[i]==s[j])j++;
num[i+1]=num[j]+1;//不同处
while(j>(i+1)/2)j=nx[j];
ans=(ans*(num[j]+1))%mod;
}
cout<<ans<<endl;
}
signed main(){
t=read();
num[1]=1;
while(t--){
cin>>s;
ans=1;
getNext(s,s.size());
work(s);
}
return 0;
}
为什么num数组的位置变了就过不了了,上面是 AC的