답안 #26463

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
26463 2017-07-01T05:33:07 Z WhipppedCream 수열 (BOI14_sequence) C++14
0 / 100
0 ms 11788 KB
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define pb push_back
#define mp make_pair
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector< ii > vii;
typedef long long L;
typedef vector< L > vL;
typedef vector< vL > vvL;
typedef vector< vi > vvi;
typedef vector< vii > vvii;
const int inf = 1e9;
const L inf8 = 1e18;
const int maxn = 2e6 + 5;
const int md = 1e9 + 7;
void np()
{
	puts("NOT POSSIBLE"); exit(0);
}
void nu()
{
	puts("NOT UNIQUE"); exit(0);
}
void add(int &a, int b)
{
	a += b;
	if(a>= md) a -= md;
}
void sub(int &a, int b)
{
	a -= b;
	if(a< 0) a += md;
}
int mul(int a, int b)
{
	return (1LL*a*b)%md;
}
int power(int a, int b)
{
	if(b == 0) return 1;
	int x = power(a, b/2);
	int y = mul(x, x);
	if(b%2) y = mul(y, a);
	return y;
}
int inv(int a)
{
	return power(a, md-2);
}
int Hash[maxn];
int val[26];
int magic;
char s[maxn];
void calc_hash(int n)
{
	for(int i = 0; i< 26; i++) val[i] = rand();
	magic = rand();
	for(int i = 0; i< n; i++)
	{
		add(Hash[i], i?Hash[i-1]:0);
		add(Hash[i], mul(power(magic, i), val[s[i]-'A']));
	}
}
int find_hash(int a, int b)
{
	int stand = Hash[b];
	sub(stand, a?Hash[a-1]:0);
	stand = mul(stand, inv(power(magic, a)));
	return stand;
}
int main()
{
	srand(time(NULL));
	int n; scanf("%d", &n);
	scanf("%s", s);
	if(n%2 == 0 || n<= 2) np();
	calc_hash(n);
	int A = find_hash(0, n/2-1);
	int B = find_hash(n/2+1, n-1);
	int a, b;
	a = b = 0;
	for(int i = n/2; i< n; i++)
	{
		int left = i>n/2?find_hash(n/2, i-1):0;
		int right = i+1<n?find_hash(i+1, n-1):0;
		right = mul(right, power(magic, i-n/2));
		add(left, right);
		if(A == left) a++;
	}
	for(int i = 0; i<= n/2; i++)
	{
		int left = i?find_hash(0, i-1):0;
		int right = i+1<=n/2?find_hash(i+1, n/2):0;
		right = mul(right, power(magic, i));
		add(left, right);
		if(left == B) b++;
	}
	if(a && b) nu();
	if(a == 0 && b == 0) np();
	if(a) for(int i = 0; i< n/2; i++) printf("%c", s[i]);
	else for(int i = n/2+1; i< n; i++) printf("%c", s[i]);
	return 0;
}

Compilation message

sequence.cpp: In function 'int main()':
sequence.cpp:77:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int n; scanf("%d", &n);
                        ^
sequence.cpp:78:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s", s);
                ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 11788 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 11788 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 11788 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 11788 KB Output isn't correct
2 Halted 0 ms 0 KB -