結果
| 問題 | No.2162 Copy and Paste 2 |
| コンテスト | |
| ユーザー |
Solanum_tuberosum
|
| 提出日時 | 2026-10-10 20:05:00 |
| 言語 | C++14 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
TLE
不安定
|
| 実行時間 | - |
| コード長 | 1,245 bytes |
| 記録 | |
| コンパイル時間 | 939 ms |
| コンパイル使用メモリ | 182,808 KB |
| 実行使用メモリ | 7,856 KB |
| 最終ジャッジ日時 | 2026-10-10 20:05:27 |
| 合計ジャッジ時間 | 22,085 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge4_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | TLE * 1 -- * 2 |
| other | -- * 26 |
ソースコード
#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(){
while(1)
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));
}
Solanum_tuberosum