1 条题解
-
0
理论来说,当 确定时可通过枚举 来计算方案数。
先通过计算某一段长度的 ,显然的,合法的 必定同时在 的公共后缀中。再计算所有长度的 可以解决,时间复杂度
#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
- 上传者