답안 #714718

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
714718 2023-03-25T08:23:09 Z amirhoseinfar1385 Necklace (Subtask 1-3) (BOI19_necklace1) C++17
5 / 85
1500 ms 1364 KB
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
int n,m;
int base=33,mod=1e9+7;
int ww(int a){
	if(a>=mod){
		a-=mod;
	}
	return a;
}
int mp[maxn],revmp[maxn];
long long mypow(long long m,long long y){
	if(y==0){
		return 1;
	}
	long long p=mypow(m,(y>>1));
	p*=p;
	p%=mod;
	if(y&1){
		p*=m;
		p%=mod;
	}
	return p;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);	
	mp[0]=1;
	for(int i=1;i<maxn;i++){
		mp[i]=1ll*mp[i-1]*base%mod;
	}
	revmp[maxn-1]=mypow(mp[maxn-1],mod-2);
	for(int i=maxn-2;i>=0;i--){
		revmp[i]=1ll*revmp[i+1]*base%mod;
	}
	string s,ss;
	cin>>s>>ss;
	n=s.size();
	m=ss.size();
	vector<int>hashn(n+2),revhashn(n+2),hashm(m+2),revhashm(m+2);	
	for(int i=1;i<=n;i++){
		hashn[i]=(1ll*mp[i-1]*s[i-1]+hashn[i-1])%mod;
	}
	for(int i=n;i>0;i--){
		revhashn[i]=(1ll*mp[n-i]*s[i-1]+revhashn[i+1])%mod;
	}
	for(int i=1;i<=m;i++){
		hashm[i]=(1ll*ss[i-1]*mp[i-1]+hashm[i-1])%mod;
	}
	for(int i=m;i>0;i--){
		revhashm[i]=(1ll*mp[m-i]*ss[i-1]+revhashm[i+1])%mod;
	}
	vector<pair<int ,int>>allh[n+1];
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			int fake=mod+hashn[j]-hashn[i-1];
			fake=ww(fake);
			fake=1ll*fake*revmp[i-1]%mod;
			allh[j-i+1].push_back(make_pair(fake,i));
//			if(i==4&&j==n){
//				cout<<fake<<" 1"<<endl;
//			}
		}
	}
	for(int i=0;i<=n;i++){
		sort(allh[i].begin(),allh[i].end());
		allh[i].resize(unique(allh[i].begin(),allh[i].end())-allh[i].begin());
	}
	pair<int,pair<int,int>>res;
	res.first=-1;
	for(int i=1;i<=m;i++){
		for(int j=i;j<=m;j++){
			if(j-i+1>n){
				continue;
			}
			for(int h=i;h<=j;h++){
				int fake=mod+hashm[j]-hashm[h-1];
				fake=ww(fake);
				fake=1ll*fake*revmp[h-1]%mod;
				fake+=1ll*(hashm[h]-hashm[i-1]+mod)*revmp[i-1]%mod*mp[j-h+1]%mod;
				fake=ww(fake);
				int p=lower_bound(allh[j-i+1].begin(),allh[j-i+1].end(),make_pair(fake,-1))-allh[j-i+1].begin();
				if(p!=allh[j-i+1].size()&&allh[j-i+1][p].first==fake){
					res=max(res,make_pair(j-i+1,make_pair(i,allh[j-i+1][p].second)));
				}
				fake=mod+revhashm[i]-revhashm[h+1];
//				if(i==3&&j==6&&h==4){
//					cout<<fake<<" 2 "<<endl;
//				}
				fake=ww(fake);
				fake=1ll*fake*revmp[m-h]%mod;
				int z=1ll*(mod+revhashm[h+1]-revhashm[j+1])*revmp[m-j]%mod*mp[h-i+1]%mod;
				fake+=z;
				fake=ww(fake);
	//			if(i==3&&j==6&&h==4){
	//				cout<<fake<<" 2 "<<z<<endl;
	//			}
				p=lower_bound(allh[j-i+1].begin(),allh[j-i+1].end(),make_pair(fake,-1))-allh[j-i+1].begin();
				if(p!=allh[j-i+1].size()&&allh[j-i+1][p].first==fake){
					res=max(res,make_pair(j-i+1,make_pair(i,allh[j-i+1][p].second)));
				}
			}
		}
	}
	if(res.first==-1){
		cout<<-1<<"\n";
		return 0;
	}
	cout<<res.first<<"\n";
	cout<<res.second.second-1<<" "<<res.second.first-1<<"\n";
}

Compilation message

necklace.cpp: In function 'int main()':
necklace.cpp:86:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |     if(p!=allh[j-i+1].size()&&allh[j-i+1][p].first==fake){
      |        ~^~~~~~~~~~~~~~~~~~~~
necklace.cpp:102:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     if(p!=allh[j-i+1].size()&&allh[j-i+1][p].first==fake){
      |        ~^~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 468 KB Output is correct
2 Correct 18 ms 468 KB Output is correct
3 Correct 17 ms 448 KB Output is correct
4 Correct 13 ms 472 KB Output is correct
5 Partially correct 22 ms 340 KB Output is partially correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 468 KB Output is correct
2 Correct 18 ms 468 KB Output is correct
3 Correct 17 ms 448 KB Output is correct
4 Correct 13 ms 472 KB Output is correct
5 Partially correct 22 ms 340 KB Output is partially correct
6 Correct 878 ms 1364 KB Output is correct
7 Partially correct 1353 ms 1364 KB Output is partially correct
8 Correct 1022 ms 1356 KB Output is correct
9 Execution timed out 1575 ms 1236 KB Time limit exceeded
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 468 KB Output is correct
2 Correct 18 ms 468 KB Output is correct
3 Correct 17 ms 448 KB Output is correct
4 Correct 13 ms 472 KB Output is correct
5 Partially correct 22 ms 340 KB Output is partially correct
6 Correct 878 ms 1364 KB Output is correct
7 Partially correct 1353 ms 1364 KB Output is partially correct
8 Correct 1022 ms 1356 KB Output is correct
9 Execution timed out 1575 ms 1236 KB Time limit exceeded
10 Halted 0 ms 0 KB -