36pts RE求调
查看原帖
36pts RE求调
735769
Liurunyao0楼主2024/3/10 11:47
#include <bits/stdc++.h>
#define int unsigned long long 
using namespace std;
const int p=1331;
const int N=5e5+5;
int n,q,a[N],pri[N],cnt,ys[N],y[N];
string s;
bool f[N];
inline void init()
{
    for(int i=2;i<=n;i++)
    {
        if(!f[i])
        {
            pri[++cnt]=i;
        }
        for(int j=1;j<=cnt;j++)
        {
            f[i*pri[j]]=true;
            if(i%pri[j]==0) break; 
        }
    }
    y[0]=1;
    for(int i=1;i<=n;i++)
    {
        y[i]=y[i-1]*p;
    }
    for(int i=1;i<=n;i++)
    {
        a[i]=a[i-1]*p+s[i-1];
    }
}
inline bool check(int x,int c,int start)
{
    int fs=a[start+c-1]-a[start+x-1]*y[c-x];
   
    int sc=a[start+c-x-1]-a[start-1]*y[c-x];
 //   cout<<fs<<" "<<start+c-1<<" "<<start+x-1<<" "<<start+c-x-1<<" "<<sc<<endl;
    return (fs==sc);
}
signed main()
{
	//freopen("1.in","r",stdin);
	//freopen("a.out","w",stdout);
    cin>>n;
    cin>>s;
    init();
    cin>>q;
    while(q--)
    {
        memset(ys,0,sizeof(ys));
        //cout<<"p2"<<endl;
        int w,z;
        cin>>w>>z;
        int len=z-w+1,sz=0;
        int sl=len;
        for(int i=1;i<=cnt&&pri[i]*pri[i]<=sl;i++)
        {
            while(len%pri[i]==0)
            {
                ys[++sz]=pri[i];
                len/=pri[i];
            }
            if(len==1) break;
        }
        ys[0]=1;
        int ans=1;
        if(len!=1) ys[++sz]=len;
        for(int i=0;i<=sz;i++)
        {
            if(check(sl/ys[i],sl,w))
            {
                sl/=ys[i];
            }
          /*  else 
            {
            	ans*=ys[i];
            	break;
			}*/
		//	cout<<ys[i]<<" ";
        }
        cout<<sl<<endl;
    }
    return 0; 
}

求大佬帮助

2024/3/10 11:47
加载中...