悬关求助 WA on #80
  • 板块CF955D Scissors
  • 楼主Milthm
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/17 20:51
  • 上次更新2024/3/17 23:08:58
查看原帖
悬关求助 WA on #80
761125
Milthm楼主2024/3/17 20:51

好像只有这一个点 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;
}

2024/3/17 20:51
加载中...