結果

問題 No.2162 Copy and Paste 2
コンテスト
ユーザー Solanum_tuberosum
提出日時 2026-10-10 19:51:37
言語 C++14
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++14 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 50 ms / 7,000 ms
+ 349µs
コード長 1,232 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,608 ms
コンパイル使用メモリ 187,328 KB
実行使用メモリ 17,864 KB
最終ジャッジ日時 2026-10-10 19:52:02
合計ジャッジ時間 3,946 ms
ジャッジサーバーID
(参考情報)
judge4_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 26
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
const int N = 4e6+5;
int n,len[N],g[N],p[N],fa[N];ll h[N];
const ll mod = 1e9+7,w = 131;
ll hsh(int l,int r){
    return ((h[r]-(h[l-1]*p[r-l+1])%mod)%mod+mod)%mod;
}int fnd(int x){
    return x==fa[x]?x:fa[x]=fnd(fa[x]);
}void merge(int x,int y){
    x = fnd(x),y=fnd(y);
    if(x<=y)fa[x]=y;
    else fa[y]=x;
}int main(){
    cin>>s;
    n = s.size(),s=" "+s;
    p[0]=1;
    for(int i = 1;i<=n+1;i++)fa[i]=i;
    for(int i = 1;i<=n;i++){h[i]=(h[i-1]*w%mod+s[i])%mod,p[i]=p[i-1]*w%mod;}
    for(int i = 1;i<=n;i++){
        int l = i,r=n+1;
        while(l+1<r){
            int mid = (l+r)>>1,len = mid-i+1;
            if(hsh(1,len)==hsh(i,mid))l=mid;
            else r = mid;
        }
        if(s[i]!=s[1])len[i]=0;
        else len[i]=l-i+1;
    }
    for(int i = 1;i<=n;i++)if(len[i]==0)merge(i,i+1);
    for(int j = 1;j<=n;j++){
        g[j]=max(g[j],g[j-1]);
        int f = g[j]-1;
        for(int i = j+1;i<=n;){
            if(len[i]<j){
                merge(i,i+1);
                i=fnd(i);
                continue;
            }
            g[i+j-1]=max(f+j-1,g[i+j-1]),f+=j-1,i+=j;
        }
    }
    printf("%d\n",n-max(g[n],0));
}
0