【NOIP模拟赛】最大跨距

在这里插入图片描述

hash加贪心就行了

#include<bits/stdc++.h>
#define M 10007
#define MOD 1000000007
using namespace std;
long long s[100005],s1,s2;
long long basic1,basic2;
long long tot,tot1,tot2,st=-1;
char ch;
int main(){
   basic1=basic2=1;
   ch=getchar();
   while(ch!=','){
   	s[++tot]=s[tot-1]*M%MOD+ch%MOD;
   	s[tot]%=MOD;
   	ch=getchar();
   }
   ch=getchar();
   while(ch!=','){
   	tot1++;
   	s1*=M;
   	s1%=MOD;
   	basic1*=M;
   	basic1%=MOD;
   	s1+=ch;
   	ch=getchar();
   }
   ch=getchar();
   while(ch!=10){
   	tot2++;
   	s2*=M;
   	s2%=MOD;
   	basic2*=M;
   	basic2%=MOD;
   	s2+=ch;
   	ch=getchar();
   }
   s1%=MOD;
   s2%=MOD;
   for(int i=0;i<=tot-tot1;i++){
   	long long calc=s[tot1+i]-(s[i]%MOD)*basic1%MOD;
   	while(calc<0) calc+=MOD;
   	if(calc==s1){
   		st=i+tot1;
   		break;
   	}
   }
   if(st==-1){
   	puts("-1");
   	return 0;
   }
   for(int i=tot-tot2;i>=st;i--){
   	long long calc=s[tot2+i]-(s[i]%MOD)*basic2%MOD;
   	while(calc<0) calc+=MOD;
   	if(calc==s2){
   		printf("%d",i-st);
   		return 0;
   	}
   }
   puts("-1");
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值