답안 #255053

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
255053 2020-07-31T07:15:31 Z MrRobot_28 Lampice (COCI19_lampice) C++17
컴파일 오류
0 ms 0 KB
#include <bits/stdc++.h>
#include<unordered_map>

using namespace std;
#define int long long
int n;
string s;

vector <vector <int> > g;
vector <int> _sz, h;
vector <bool> used;
bool flag;
int len;
vector <int> hash1, hash2;
std::unordered_map <int, int> mp;
std::unordered_map<int, int> mp1;
vector <int> power;
const int const1 = 1e9 + 7;
void dfs1(int v, int p = -1)
{
	_sz[v] = 1;
	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(to != p && !used[to])
		{
			h[to] = h[v] + 1;
			dfs1(to, v);
			_sz[v] += _sz[to];
		}
	}
}
void build(int v, int p = -1)
{
	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(to != p && !used[to])
		{
			h[to] = h[v] + 1;
			build(to, v);
		}
	}
}
int centroid(int v, int szall, int p = -1)
{
	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(to == p || used[to])
		{
			continue;
		}
		if(_sz[to] * 2 > szall)
		{
			return centroid(to, szall, v);
		}
	}
	return v;
}
vector <int> vec;
void dfs2(int v, int p)
{
	int ourhash = hash1[v];
	bool fl = false;
	vec.push_back(v);
	if(len >= h[v])
	{
	if(len - h[v] < h[v])
	{
		int len1 = len - h[v];
		ourhash -= hash1[vec[vec.size() - len1 - 1]] * power[len1] % const1;
		if(hash1[vec[vec.size() -  len1 - 1]] == hash2[vec[vec.size() - len1 - 1]])
		{
			fl = true;
		}
		if(ourhash < 0)
		{
			ourhash += const1;
		}
	}
	else
	{
		fl = true;
	}
	if(fl && mp[{ourhash, len - h[v]}] != 0)
	{
		flag = true;
	}
	}
	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(!used[to] && to != p)
		{
			hash1[to] = hash1[v] * 27 % const1 + s[to] - 'a' + 1;
			if(hash1[to] >= const1)
			{
				hash1[to] -= const1;
			}
			hash2[to] = hash2[v] + power[h[v]] * (s[to] - 'a' + 1) % const1;
			if(hash2[to] >= const1)
			{
				hash2[to] -= const1;
			}
				dfs2(to, v);
		}
	}
	vec.pop_back();
}
vector <pair <int, int> > mass;
void dfs3(int v, int p)
{
	int ourhash = hash1[v];
	bool fl = false;
	vec.push_back(v);
	if(len >= h[v] + 1)
	{
	if(len - (h[v] + 1) < (h[v] + 1))
	{
		int len1 = len - (h[v] + 1);
		ourhash -= hash1[vec[vec.size() - len1 - 1]] * power[len1] % const1;
		if(ourhash < 0)
		{
			ourhash += const1;
		}
		if(hash1[vec[vec.size() - len1 - 1]] == hash2[vec[vec.size() - len1 - 1]])
		{
			fl = true;
		}
	}
	else
	{
		fl = true;
	}
	if(fl)
	{
		mass.push_back({ourhash, h[v] + 1});
		mp[{ourhash, h[v] + 1}]++;
	}
	}	
	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(to != p && !used[to])
		{
			hash1[to] = hash1[v] * 27 % const1 + s[to] - 'a' + 1;
			if(hash1[to] >= const1)
			{
				hash1[to] -= const1;
			}
			hash2[to] = hash2[v] + power[h[to]] * (s[to] - 'a' + 1) % const1;
			if(hash2[to] >= const1)
			{
				hash2[to] -= const1;
			}
			dfs3(to, v);
		}
	}
	vec.pop_back();
}
void go_to(int v)
{
	dfs1(v);
	v = centroid(v, _sz[v]);
	h[v] = 0;
	build(v);
	used[v] = 1;
	hash1[v] = hash2[v] = s[v] - 'a' + 1;
	mp[{s[v] - 'a' + 1, 1}] = 1;
	mass.push_back({s[v] -'a' + 1, 1});
	for(int i = 0; i  <g[v].size(); i++)
	{
		int to = g[v][i];
		if(!used[to])
		{
			hash1[to] = hash2[to] = s[to] - 'a' + 1;
			dfs2(to, v);
			vec.clear();
			vec.push_back(v);
			hash1[to] = (s[v] - 'a' + 1) * 27 + (s[to] - 'a' + 1);
			hash2[to] = (s[v] - 'a' + 1) + 27 * (s[to] - 'a' + 1);
			dfs3(to, v);
			vec.clear();
		}
	}
	while(mass.size() > 0)
	{
		pair <int, int> v = mass.back();
		mp[v]--;
		mass.pop_back();
	}
	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(!used[to])
		{
			go_to(to);
		}
	}
}
signed main(){
//	ios_base::sync_with_stdio(false);
//	cin.tie(NULL);
//	cout.tie(NULL);
	cin >> n;
	used.resize(n);
	_sz.resize(n);
	cin >> s;
	power.resize(n + 1);
	power[0] = 1;
	for(int i = 1; i <= n; i++)
	{
		power[i] = power[i - 1] * 27 % const1;
	}
	h.resize(n);
	hash1.resize(n);
	hash2.resize(n);
	g.resize(n);
	for(int i = 0; i < n - 1; i++)
	{
		int a, b;
		cin >> a >> b;
		a--;
		b--;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	int l = 0, r = n / 2 + 1;
	while(r - l > 1)
	{
		int midd = (r + l) / 2;
		len = midd * 2;
		for(int i = 0; i < n; i++)
		{
			used[i] = 0;
		}
		flag = false;
		go_to(0);
		if(flag)
		{
			l = midd;
		}
		else
		{
			r = midd;
		}
	}
	int l1 = 0, r1 = n / 2 + 1;
	while(r1 - l1 > 1)
	{
		int midd = (r1 + l1) / 2;
		len = midd * 2 + 1;
		for(int i = 0; i < n; i++)
		{
			used[i] = 0;
		}
		flag = false;
		go_to(0);
		if(flag)
		{
			l1 = midd;
		}
		else
		{
			r1 = midd;
		}
	}
	cout << l << " " << l1 << "\n";
	cout << max(l * 2, l1 * 2 + 1);
	return 0;
}

Compilation message

lampice.cpp: In function 'void dfs1(long long int, long long int)':
lampice.cpp:22:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~
lampice.cpp: In function 'void build(long long int, long long int)':
lampice.cpp:35:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~
lampice.cpp: In function 'long long int centroid(long long int, long long int, long long int)':
lampice.cpp:47:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~
lampice.cpp: In function 'void dfs2(long long int, long long int)':
lampice.cpp:86:13: error: no match for 'operator[]' (operand types are 'std::unordered_map<long long int, long long int>' and '<brace-enclosed initializer list>')
  if(fl && mp[{ourhash, len - h[v]}] != 0)
             ^
In file included from /usr/include/c++/7/unordered_map:48:0,
                 from /usr/include/c++/7/functional:60,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:71,
                 from lampice.cpp:1:
/usr/include/c++/7/bits/unordered_map.h:975:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](const key_type& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:975:7: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const key_type& {aka const long long int&}'
/usr/include/c++/7/bits/unordered_map.h:979:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](key_type&& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:979:7: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'std::unordered_map<long long int, long long int>::key_type&& {aka long long int&&}'
lampice.cpp:91:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~
lampice.cpp: In function 'void dfs3(long long int, long long int)':
lampice.cpp:139:5: error: no match for 'operator[]' (operand types are 'std::unordered_map<long long int, long long int>' and '<brace-enclosed initializer list>')
   mp[{ourhash, h[v] + 1}]++;
     ^
In file included from /usr/include/c++/7/unordered_map:48:0,
                 from /usr/include/c++/7/functional:60,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:71,
                 from lampice.cpp:1:
/usr/include/c++/7/bits/unordered_map.h:975:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](const key_type& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:975:7: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const key_type& {aka const long long int&}'
/usr/include/c++/7/bits/unordered_map.h:979:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](key_type&& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:979:7: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'std::unordered_map<long long int, long long int>::key_type&& {aka long long int&&}'
lampice.cpp:142:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~
lampice.cpp: In function 'void go_to(long long int)':
lampice.cpp:170:4: error: no match for 'operator[]' (operand types are 'std::unordered_map<long long int, long long int>' and '<brace-enclosed initializer list>')
  mp[{s[v] - 'a' + 1, 1}] = 1;
    ^
In file included from /usr/include/c++/7/unordered_map:48:0,
                 from /usr/include/c++/7/functional:60,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:71,
                 from lampice.cpp:1:
/usr/include/c++/7/bits/unordered_map.h:975:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](const key_type& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:975:7: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const key_type& {aka const long long int&}'
/usr/include/c++/7/bits/unordered_map.h:979:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](key_type&& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:979:7: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'std::unordered_map<long long int, long long int>::key_type&& {aka long long int&&}'
lampice.cpp:172:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i  <g[v].size(); i++)
                 ~~~^~~~~~~~~~~~
lampice.cpp:190:5: error: no match for 'operator[]' (operand types are 'std::unordered_map<long long int, long long int>' and 'std::pair<long long int, long long int>')
   mp[v]--;
     ^
In file included from /usr/include/c++/7/unordered_map:48:0,
                 from /usr/include/c++/7/functional:60,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:71,
                 from lampice.cpp:1:
/usr/include/c++/7/bits/unordered_map.h:975:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](const key_type& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:975:7: note:   no known conversion for argument 1 from 'std::pair<long long int, long long int>' to 'const key_type& {aka const long long int&}'
/usr/include/c++/7/bits/unordered_map.h:979:7: note: candidate: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = long long int; _Tp = long long int; _Hash = std::hash<long long int>; _Pred = std::equal_to<long long int>; _Alloc = std::allocator<std::pair<const long long int, long long int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = long long int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = long long int]
       operator[](key_type&& __k)
       ^~~~~~~~
/usr/include/c++/7/bits/unordered_map.h:979:7: note:   no known conversion for argument 1 from 'std::pair<long long int, long long int>' to 'std::unordered_map<long long int, long long int>::key_type&& {aka long long int&&}'
lampice.cpp:193:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~