답안 #992290

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
992290 2024-06-04T08:35:57 Z todorokishotoua1 Necklace (Subtask 4) (BOI19_necklace4) C++14
0 / 15
26 ms 65536 KB
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
// #pragma GCC optimize("O3,unroll-loops")


#include<bits/stdc++.h>
using namespace std;
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
// typedef tree<
//     int,
//     null_type,
//     less_equal<int>,
//     rb_tree_tag,
//     tree_order_statistics_node_update
// >
// ordered_set;
namespace __gnu_pbds{
          typedef tree<long long,
                       null_type,
                       less_equal<long long>,
                       rb_tree_tag,
                       tree_order_statistics_node_update> ordered_set;
}
using namespace __gnu_pbds;

#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;


 
void __print32_t(int32_t x) {cerr << x;}
void __print32_t(long x) {cerr << x;}
void __print32_t(long long x) {cerr << x;}
void __print32_t(unsigned x) {cerr << x;}
void __print32_t(unsigned long x) {cerr << x;}
void __print32_t(unsigned long long x) {cerr << x;}
void __print32_t(float x) {cerr << x;}
void __print32_t(double x) {cerr << x;}
void __print32_t(long double x) {cerr << x;}
void __print32_t(char x) {cerr << '\'' << x << '\'';}
void __print32_t(const char *x) {cerr << '\"' << x << '\"';}
void __print32_t(const string &x) {cerr << '\"' << x << '\"';}
void __print32_t(bool x) {cerr << (x ? "true" : "false");}
 
template<typename T, typename V>
void __print32_t(const pair<T, V> &x) {cerr << '{'; __print32_t(x.first); cerr << ','; __print32_t(x.second); cerr << '}';}
template<typename T>
void __print32_t(const T &x) {int32_t f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print32_t(i); cerr << "}";}
void _print32_t() {cerr << "]\n";}
template <typename T, typename... V>
void _print32_t(T t, V... v) {__print32_t(t); if (sizeof...(v)) cerr << ", "; _print32_t(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print32_t(x)
#else
#define debug(x...)
#endif
 
template<typename T> using minpq = priority_queue<T, vector<T>, greater<T>>;
#define rep(i,a,b) for(int32_t i = a; i < b; i ++)
#define ill long long int32_t
#define ll long long
#define int int64_t
#define nl "\n"
#define el endl
#define pb push_back
#define FOR(a,b,c) for (int32_t a = b; a < c; a++)
using namespace std;
 
 
// const int32_t N = 3e5+1;
const ll neg_inf = -2e7 + 2;    
const ll inf = 1e18 + 1;
// const int32_t mod = 998244353;
// const int32_t MOD = 1e9+7;
const int32_t MAXN = 4e6+1;
const int32_t eps = 1e-6;
const int N = 2e5+1;

array<int,3> solve (string s, string t) {
    string fin = s;
    fin += '#';
    fin += t;
    int n = fin.size();

    vector<vector<int>> d1(s.size(),vector<int>(t.size(),0)); 

    for (int l = 0; l < (int)s.size(); l++) {
        vector<int> pi(n,0);
        for (int i = 1; i < (int)fin.size(); i++) {
            int j = pi[i-1];
            while (j > 0 && fin[j]!=fin[i]) j=pi[j-1];
            pi[i] = j+(fin[i]==fin[j]);
        }
        for (int i = s.size()+1; i < n; i++) {
            d1[l][i-s.size()-1] = pi[i-l];
        }
        // debug(l,pi,fin);
        fin.erase(fin.begin());
    }

    // debug(d1);

    string fin2 = t;
    fin2 += '#';
    fin2 += s;
    n = fin2.size();
    vector<vector<int>> d2(s.size(),vector<int>(t.size(),0)); 
    for (int l = 0; l < (int)t.size(); l++) {
        vector<int> pi(n,0);
        for (int i = 1; i < (int)fin2.size(); i++) {
            int j = pi[i-1];
            while (j > 0 && fin2[i]!=fin2[j]) j=pi[j-1];
            pi[i] = (j)+(fin2[i]==fin2[j]);
        }
        for (int i = t.size()+1; i < n; i++) {
            d2[i-t.size()-1][l] = pi[i-l];
        }
        // debug(l,pi,fin2);
        fin2.erase(fin2.begin());
    }

    // debug(d2);

    int ans = 0;
    int st1 = 0, st2 = 0;

    for (int i = 0; i < (int)s.size(); i++) {
        for (int j = 0; j < (int)t.size(); j++) {
            int currans = d1[i][j];
            if (i-1 >= 0 && j+1 < (int)t.size()) {
                currans += d2[i-1][j+1];
            }
            if (currans > ans) {
                ans = currans;
                int torem1 = i;
                int torem2 = j+1-d1[i][j];
                if (i-1 >= 0 && j+1 < (int)t.size()) {
                    torem1 -= d2[i-1][j+1];
                }
                st1 = torem1;
                st2 = torem2;
            }
        }
    }


    return {ans,st1,st2};
}


ll runcases()
{  

    string s,t;
    cin >> s >> t;
    // debug(s,t);
    auto ans1 = solve(s,t);
    // debug(s,t,ans1);
    reverse(t.begin(),t.end());
    auto ans2 = solve(s,t);
    // debug(ans2);
    if (ans1[0] > ans2[0]) {
        cout << ans1[0] << nl << ans1[1] << " " << ans1[2];
    }
    else {
        cout << ans2[0] << nl << ans2[1] << " " << t.size()-(ans2[0]+ans2[2]);
    }

    return 0;
}

 
signed main()
{
    
    //..........Fast I/O.........//
    // ios_base::sync_with_stdio(false);
    // cin.tie(0);cout.tie(0);
    //..........................//


 

    ll t ;
 
    t = 1;

    // debug(t);
    for (int32_t i = 1; i <= t; i ++) {
        runcases();
    }
    
    return 0;
 
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 26 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -