玄关,求解惑
查看原帖
玄关,求解惑
1029919
up_p楼主2025/7/28 16:58
#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的

2025/7/28 16:58
加载中...