好像只有这一个点 WA,但是不知道怎么改,正确答案是有解,但是我的程序输出 NO。
#include<bits/stdc++.h>
#define N 500005
using namespace std;
const long long mod=1e9+7,base=233;
int l1,l2,k,dp[N],l[N],r[N];
long long f1[N],f2[N],b[N];
struct node{
int x,id;
}ex[N];
bool cmp(node a,node b){
return a.x<b.x;
}
string s,t;
int get(int l,int r,int op){
if(op==0)return ((f1[r]-f1[l-1]*b[r-l+1])%mod+mod)%mod;
else return ((f2[r]-f2[l-1]*b[r-l+1])%mod+mod)%mod;
}
set<int>S;
signed main(){
cin>>l1>>l2>>k>>s>>t;
//if(l1==166723){
// cout<<"Yes\n3370 85047";return 0;
//}
b[0]=1;
for(int i=1;i<=N-5;++i)b[i]=b[i-1]*base%mod;
s=" "+s;t=" "+t;
for(int i=1;i<=l1;++i)f1[i]=(f1[i-1]*base+s[i])%mod;
for(int i=1;i<=l2;++i)f2[i]=(f2[i-1]*base+t[i])%mod;
if(l2<=k){
for(int i=1;i<=l1-l2+1;++i){
if(get(i,i+l2-1,0)==f2[l2])dp[i]=dp[i-1]+1;
else dp[i]=dp[i-1];
}
for(int i=1;i<=l1-k*2+1;++i){
if(dp[i+k-1]-dp[i-1])return cout<<"Yes\n"<<i<<" "<<i+k,0;
}
}
for(int i=1;i<=l1;++i){
int L=1,R=l1-i+1,ans=0;
while(L<=R){
int mid=(L+R)>>1;
if(get(i,i+mid-1,0)==f2[mid])L=mid+1,ans=mid;
else R=mid-1;
}
ex[i]={ans,i};
}
sort(ex+1,ex+l1+1,cmp);int now=l1;
for(int i=l1;i>=1;--i){
while(ex[now].x>=i)S.insert(ex[now].id),--now;
l[i]=*S.lower_bound(k-i+1);
if(l[i]<=0)l[i]=1e9;
}
for(int i=1;i<=l1;++i)f1[i]=(f1[i-1]*base+s[l1-i+1])%mod;
for(int i=1;i<=l2;++i)f2[i]=(f2[i-1]*base+t[l2-i+1])%mod;
for(int i=1;i<=l1;++i){
int L=1,R=l1-i+1,ans=0;
while(L<=R){
int mid=(L+R)>>1;
if(get(i,i+mid-1,0)==f2[mid])L=mid+1,ans=mid;
else R=mid-1;
}
ex[i]={ans,i};
}
sort(ex+1,ex+l1+1,cmp);S.clear();now=l1;
for(int i=l1;i>=1;--i){
while(ex[now].x>=i)S.insert(ex[now].id),--now;
r[i]=l1-*S.lower_bound(k-i+1)+1;
if(r[i]>l1)r[i]=-1e9;
}
for(int i=1;i<=k;++i){
if(l[i]+i>k&&l2-i>=1&&l2-i<=k&&r[l2-i]-(l2-i)+1<=l1-k+1&&l[i]+i-1<r[l2-i]-(l2-i)+1){
cout<<"Yes\n"<<l[i]+i-k<<" "<<r[l2-i]-(l2-i)+1;return 0;
}
}
cout<<"No";
return 0;
}