結果
| 問題 | 
                            No.2162 Copy and Paste 2
                             | 
                    
| コンテスト | |
| ユーザー | 
                             hotman78
                         | 
                    
| 提出日時 | 2022-12-13 13:54:30 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,809 bytes | 
| コンパイル時間 | 3,967 ms | 
| コンパイル使用メモリ | 248,500 KB | 
| 最終ジャッジ日時 | 2025-02-09 10:55:34 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 16 WA * 10 | 
ソースコード
#include<bits/stdc++.h>
#include<atcoder/string>
#include<atcoder/segtree>
using namespace std;
using namespace atcoder;
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#include<ext/pb_ds/tag_and_trait.hpp>
template<typename T>using pbds=__gnu_pbds::tree<T,__gnu_pbds::null_type,less<T>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>;
template<typename T>using pbds_map=__gnu_pbds::tree<T,T,less<T>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update>;
template<typename T,typename E>using hash_map=__gnu_pbds::gp_hash_table<T,E>;
template<typename T>using pqueue =__gnu_pbds::priority_queue<T, greater<T>,__gnu_pbds::rc_binomial_heap_tag>;
using lint=long long;
#define rep(i,n) for(int i=0;i<int(n);++i)
int op(int a, int b) {
    return max(a, b);
}
int e() {
    return (int)(0);
}
int main(){
    string s;
    cin>>s;
    int n=s.size();
    segtree<int, op, e> seg(n+1);
    pbds<int> st;
    vector<vector<int>>v(n+1);
    auto z=z_algorithm(s);
    for(int i=0;i<n;++i){if(z[i]!=0)st.insert(i);}
    for(int i=0;i<n;++i){
        // cerr<<z[i]<<endl;
        v[z[i]].emplace_back(i);
    }
    for(int i=2;i<n+1;++i){
        // cerr<<"i:"<<i<<endl;
        for(auto e:v[i-1]){
            st.erase(e);
        }
        // for(auto e:st){
        //     cerr<<e<<endl;
        // }
        int now=i,cnt=0;
        int fst=seg.prod(0,now+1);
        while(1){
            ++cnt;
            int itr=st.order_of_key(now);
            if(itr==st.size())break;
            int to=*st.find_by_order(itr)+i;
            if(to>n)break;
            // cerr<<fst<<" "<<to<<endl;
            seg.set(to,fst+cnt*(i-1)-1);
            now=to;
        }
    }
    cout<<n-seg.all_prod()<<endl;
}
            
            
            
        
            
hotman78