1 条题解

  • 0
    @ 2025-10-13 10:30:27

    理论来说,当 yy 确定时可通过枚举 yy 来计算方案数。

    先通过计算某一段长度的 yy,显然的,合法的 yy 必定同时在 s,ts,t 的公共后缀中。再计算所有长度的 yy 可以解决,时间复杂度 O(m+mlogMOD)O(m+\sqrt{m}\log MOD)

    #include<bits/stdc++.h>
    using namespace std;
    constexpr int N=1e7+5;
    typedef long long ll;
    constexpr ll base=20081023;
    int n,m,pre,suf;
    string s,t;
    ll qpow(ll a,int b,int p){
    	ll res=1;
    	while(b){
    		if(b&1)res=res*a%p;
    		a=a*a%p;
    		b>>=1;
    	}
    	return res;
    }
    struct Hashhh{
    	ll pow[N],H1[N],H2[N],MOD;
    	unordered_map<ll,ll> inver;
    	inline ll inv(ll x){return inver[x]?inver[x]:inver[x]=qpow(x,MOD-2,MOD);}
    	inline void figure(int mmm){
    		MOD=mmm;
    		pow[0]=1;
    		for(int i=1;i<=m;i++)pow[i]=pow[i-1]*base%MOD;
    		for(int i=1;i<=n;i++)H1[i]=(H1[i-1]*base+s[i])%MOD;
    		for(int i=1;i<=m;i++)H2[i]=(H2[i-1]*base+t[i])%MOD;
    	}
    	inline bool judge(int ls,int rs,int lt,int rt){
    		int lens=rs-ls+1,lent=rt-lt+1;
    		if(lent%lens)return 0;
    		ll pat=((H1[rs]-H1[ls-1]*pow[lens])%MOD+MOD)%MOD;
    		ll text=((H2[rt]-H2[lt-1]*pow[lent])%MOD+MOD)%MOD;
    		return pat*(pow[lent]-1)%MOD*inv(pow[lens]-1)%MOD==text;
    	}
    }hash1,hash2;
    bool equal(int ls,int rs,int lt,int rt){return hash1.judge(ls,rs,lt,rt)&&hash2.judge(ls,rs,lt,rt);}
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m>>s>>t;
    	s="$"+s;t="$"+t;
    	pre=0;
    	while(pre<n&&s[pre+1]==t[pre+1])pre++;
    	suf=n+1;
    	while(suf>1&&s[suf-1]==t[m-n+suf-1])suf--;
    	// cerr<<pre<<' '<<suf<<endl;
    	hash1.figure(998244353);
    	hash2.figure(1000000007);
    	ll ans=0;int len=pre-suf+1;
    	for(int i=1;i*i<=m-n;i++){
    		if((m-n)%i)continue;
    		if(i<=len&&equal(pre-i+1,pre,pre-i+1,m-n+pre))ans+=len-i+1;//cerr<<ans<<' ';
    		int ii=(m-n)/i;
    		if(i!=ii&&ii<=len&&equal(pre-ii+1,pre,pre-ii+1,m-n+pre))ans+=len-ii+1;//cerr<<ans<<endl;
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
    

    信息

    ID
    34268
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者