제출 #700993

#제출 시각아이디문제언어결과실행 시간메모리
700993Doncho_Bonboncho세 명의 친구들 (BOI14_friends)C++14
0 / 100
895 ms88668 KiB
#include <bits/stdc++.h>
#include <unordered_set>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const int MAX_N = 1e6;
const int INF = 1e9;
const int mod = 1e9 + 7;

const int C = 33;

int alpfC[32];

std::unordered_map<ll, int> m;

int main () {

	std::ios_base::sync_with_stdio(false); std::cin.tie(NULL);

	int n;
	std::cin>>n;
	std::string s;
	std::cin>>s;

	for( int i=0 ; i<s.size() ; i++ ) s[i] += 'a' - 'A';

	//std::cerr<<" ! "<<s<<"\n";

	if( !(n%2) ){
		std::cout<<"NOT POSSIBLE\n";
		return 0;
	}

	int nStr = (n-1)/2;
	ll step = 1;
	for( int i=1 ; i<nStr ; i++ ) step *= C;
	for( int i=1 ; i<26 ; i++ ) alpfC[i] = alpfC[i-1] + step;

	ll currHash = 0;
	for( int i=0 ; i<nStr ; i++ ){

		currHash *= C;
		currHash %= mod;

		currHash += s[i]-'a';
		if( currHash >= mod ) currHash -= mod;
	}
	ll hashNext = currHash - ( s[nStr-1] - 'a');
	hashNext += s[nStr] - 'a';
	m[hashNext] = 2;
	
	//std::cerr<<" ! "<<currHash<<" , "<<hashNext<<"\n";

	int endNas = -1;
	int type = -1;
	int num = 0;
	

	m[currHash] = 1;
	for( int i=nStr ; i<n ; i++ ){

	//	std::cerr<<" - "<<s[i-nStr]<<" -> "<<alpfC[s[i-nStr]-'a']<<"\n";
		currHash -= alpfC[s[i-nStr]-'a'];
		if( currHash < 0 ) currHash += mod;

	//	std::cerr<<" * "<<currHash<<" * "<<C<<"\n";

		currHash *= C;
		currHash %= mod;

		ll hashNext = currHash;

		currHash += s[i] - 'a';
		if( currHash >= mod ) currHash -= mod;
	//	std::cerr<<" + "<<s[i]<<" "<<s[i] - 'a'<<"\n";

		if( i != n-1 ) hashNext += s[i+1] - 'a';
	//	std::cerr<<" + "<<s[i+1]<<" "<<s[i+1] - 'a'<<"\n";
		if( hashNext >= mod ) hashNext -= mod;

	//	std::cerr<<" $ "<<currHash<<" "<<hashNext<<"\n";

		if( m[currHash] != 0 ){
			endNas = i;
			type = 1;
			num++;
		}
		if( i != n-1 and m[hashNext] == 1 ){
			endNas = i;
			type = 2;
			num++;
		}

		m[currHash] = 1;
		if( !m[hashNext] ) m[hashNext] = 2;
	}

	for( int i=0 ; i<n ; i++ ) s[i] -= 'a' - 'A';

	if( num == 0 ) std::cout<<"NO POSSIBLE";
	else if( num > 1 ) std::cout<<"NO UNIQUE";
	else{
		if( type == 1 ){
			std::cout<<s.substr( endNas - nStr+1, endNas );
		}else{
			/*
			std::cout<<s.substr( endNas - nStr+1, endNas-3 );
			std::cout<<s[endNas+1];
			*/
	//		std::cerr<<endNas<<", "<<nStr<<"\n";
			int st = endNas - nStr;
			for( int i=st+1 ; i<st + nStr ; i++ ) std::cout<<s[i];
			std::cout<<s[endNas+1];
		}
	}

	std::cout<<"\n";

	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

friends.cpp: In function 'int main()':
friends.cpp:26:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |  for( int i=0 ; i<s.size() ; i++ ) s[i] += 'a' - 'A';
      |                 ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...