답안 #73588

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
73588 2018-08-28T13:23:17 Z polyfish 회문 (APIO14_palindrome) C++14
컴파일 오류
0 ms 0 KB
//I love armpit fetish

#include <bits/stdc++.h>
using namespace std;

#define debug(x) cerr << #x << " = " << x << '\n';
#define BP() cerr << "OK!\n";
#define PR(A, n) {cerr << #A << " = "; for (int _=1; _<=n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define PR0(A, n) {cerr << #A << " = "; for (int _=0; _<n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define FILE_NAME "data"

const int MAX_N = 300002;

struct fenwick_tree {
    int n;
    vector<int> bit;

    void init(int _n) {
        n = _n;
        bit.resize(n+1);
    }

    void upd(int id) {
        ++id;
        for (; id<=n; id += id & (-id))
            ++bit[id];
    }

    int get(int id) {
        ++id;
        int res = 0;
        for (; id>0; id -= id & (-id))
            res += bit[id];
        return res;
    }

    int get(int l, int r) {
        return get(r) - get(l-1);
    }
};

int n, gap, L[MAX_N], R[MAX_N], d1[MAX_N], d2[MAX_N];
int pos[MAX_N], sa[MAX_N], lcp[MAX_N], tmp[MAX_N];
string s;
set<pair<int, int> > seg;
fenwick_tree tr;

void enter() {
	char c;
	while (cin >> c) {
		s += '#';
		s += c;
	}
	s += '#';
	n = s.size();
}

void manacher() {
	for (int i=0, l=0, r=-1; i<n; ++i) {
		int k = i>r ? 1 : min(R[l+r-i], r-i);
		while (i+k<n && i-k>=0 && s[i+k]==s[i-k])
			++k;
		d1[i] = k--;
		if (i+k>r) {
			l = i - k;
			r = i + k;
		}
	}
}

bool cmp(int i, int j) {
    if (pos[i]!=pos[j])
        return pos[i] < pos[j];
    i += gap;
    j += gap;
    return i<n && j<n ? pos[i] < pos[j] : i > j;
}

void build_SA() {
	for (int i=0; i<n; ++i) {
		sa[i] = i;
		pos[i] = s[i];
	}
	for (gap = 1; ; gap *= 2) {
		sort(sa, sa+n, cmp);
		for (int i=1; i<n; ++i)
			tmp[i] = tmp[i-1] + cmp(sa[i-1], sa[i]);
		for (int i=0; i<n; ++i)
			pos[sa[i]] = tmp[i];
		if (tmp[n-1]==n-1)
			break;
	}
}

void build_LCP() {
	for (int i=0, k=0; i<n; ++i) {
		if (pos[i]!=n-1) {
			for (int j=sa[pos[i]+1]; i+k<n && j+k<n && s[i+k]==s[j+k];)
				++k;
			lcp[pos[i]] = k;
			if (k)
				--k;
		}
	}
}

void find_min_boundary() {
	stack<int> st;
	for (int i=0; i<n; ++i) {
		while (st.size() && lcp[st.top()]>=lcp[i])
			st.pop();
		if (st.size())
			L[i] = st.top() + 1;
		else
			L[i] = 0;
		st.push(i);
	}
	while (st.size())
		st.pop();
	for (int i=n-1; i>=0; --i) {
		while (st.size() && lcp[st.top()]>=lcp[i])
			st.pop();
		if (st.size())
			R[i] = st.top() - 1;
		else
			R[i] = n-1;
		st.push(i);
	}
}

int add_seg(int l, int r) {
    while (seg.size()) {
        set<pair<int, int> >::iterator it = seg.lower_bound(make_pair(l, l));
        if (it!=seg.end() && it->second<=r)
            seg.erase(it);
        else
            break;
    }
    seg.insert(make_pair(l, r));
    return tr.get(l, r);
}

int add_pos(int pos) {
    int res = 0;
    tr.upd(pos);
    if (seg.empty())
        return 0;
    set<pair<int, int> >::iterator it = seg.upper_bound(make_pair(pos, n+1));
    while (it!=seg.begin()) {
        --it;
        //cerr << it->first << ' ' << it->second << '\n';
        if (it->second<pos)
            break;
        res = max(res, tr.get(it->first, it->second));
    }
    return res;
}

void solve() {
	for (int i=0; i<n; ++i)
		d2[i] = d1[sa[i]];
	vector<pair<int, int> > b1, b2;
	for (int i=0; i<n; ++i) {
        b1.push_back(make_pair(lcp[i], i));
        b2.push_back(make_pair(d2[i], i));
	}
    sort(b1.begin(), b1.end());
    sort(b2.begin(), b2.end());
    tr.init(n);
    int max_cnt = 0;
    int64_t res = 0;
    if (d1[n/2]==n/2+1)
        res = n/2;
    for (int i=n/2; i>=1; --i) {
        while (b1.size() && b1.back().first>=i) {
            max_cnt = max(max_cnt, add_seg(L[b1.back().second], R[b1.back().second] + 1));
            b1.pop_back();
        }
        while (b2.size() && b2.back().first>=i) {
            max_cnt = max(max_cnt, add_pos(b2.back().second));
            b2.pop_back();
        }
        res = max(res, 1LL * (i - 1) * max_cnt);
        //debug(res);
    }
    cout << res;
}

int main() {
	#ifdef OFFLINE_JUDGE
		freopen(FILE_NAME".inp", "r", stdin);
		freopen(FILE_NAME".out", "w", stdout);
	#endif
	ios::sync_with_stdio(0); cin.tie(0);
	enter();
	manacher();
	build_SA();
	build_LCP();
	find_min_boundary();
	solve();
}

Compilation message

palindrome.cpp: In function 'void solve()':
palindrome.cpp:183:47: error: no matching function for call to 'max(int64_t&, long long int)'
         res = max(res, 1LL * (i - 1) * max_cnt);
                                               ^
In file included from /usr/include/c++/7/bits/char_traits.h:39:0,
                 from /usr/include/c++/7/ios:40,
                 from /usr/include/c++/7/istream:38,
                 from /usr/include/c++/7/sstream:38,
                 from /usr/include/c++/7/complex:45,
                 from /usr/include/c++/7/ccomplex:39,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:52,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/stl_algobase.h:219:5: note: candidate: template<class _Tp> constexpr const _Tp& std::max(const _Tp&, const _Tp&)
     max(const _Tp& __a, const _Tp& __b)
     ^~~
/usr/include/c++/7/bits/stl_algobase.h:219:5: note:   template argument deduction/substitution failed:
palindrome.cpp:183:47: note:   deduced conflicting types for parameter 'const _Tp' ('long int' and 'long long int')
         res = max(res, 1LL * (i - 1) * max_cnt);
                                               ^
In file included from /usr/include/c++/7/bits/char_traits.h:39:0,
                 from /usr/include/c++/7/ios:40,
                 from /usr/include/c++/7/istream:38,
                 from /usr/include/c++/7/sstream:38,
                 from /usr/include/c++/7/complex:45,
                 from /usr/include/c++/7/ccomplex:39,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:52,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/stl_algobase.h:265:5: note: candidate: template<class _Tp, class _Compare> constexpr const _Tp& std::max(const _Tp&, const _Tp&, _Compare)
     max(const _Tp& __a, const _Tp& __b, _Compare __comp)
     ^~~
/usr/include/c++/7/bits/stl_algobase.h:265:5: note:   template argument deduction/substitution failed:
palindrome.cpp:183:47: note:   deduced conflicting types for parameter 'const _Tp' ('long int' and 'long long int')
         res = max(res, 1LL * (i - 1) * max_cnt);
                                               ^
In file included from /usr/include/c++/7/algorithm:62:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:65,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/stl_algo.h:3462:5: note: candidate: template<class _Tp> constexpr _Tp std::max(std::initializer_list<_Tp>)
     max(initializer_list<_Tp> __l)
     ^~~
/usr/include/c++/7/bits/stl_algo.h:3462:5: note:   template argument deduction/substitution failed:
palindrome.cpp:183:47: note:   mismatched types 'std::initializer_list<_Tp>' and 'long int'
         res = max(res, 1LL * (i - 1) * max_cnt);
                                               ^
In file included from /usr/include/c++/7/algorithm:62:0,
                 from /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:65,
                 from palindrome.cpp:3:
/usr/include/c++/7/bits/stl_algo.h:3468:5: note: candidate: template<class _Tp, class _Compare> constexpr _Tp std::max(std::initializer_list<_Tp>, _Compare)
     max(initializer_list<_Tp> __l, _Compare __comp)
     ^~~
/usr/include/c++/7/bits/stl_algo.h:3468:5: note:   template argument deduction/substitution failed:
palindrome.cpp:183:47: note:   mismatched types 'std::initializer_list<_Tp>' and 'long int'
         res = max(res, 1LL * (i - 1) * max_cnt);
                                               ^