Transmission Door
Solution
Interval DP, enumerate breakpoints, for an interval, enumerate folding lengths, use hash violence to determine whether folding can be
Code
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include < algorithm> #define RE Register #define F (i,a,b) for (Re int i= (a); i<= (b); i++) using namespace Std;typedef unsigned lon G Long Ull;inline int read () {int X=0,f=1;char c=getchar (); while (!isdigit (c)) {if (c== '-') F=-f;c=getchar ();} while (IsDigit (c)) x= (x<<1) + (x<<3) +c-48,c=getchar (); return x*f;} const int N=110,bas=137;int n;ull Hs[n],pw[n];char s[n];int dp[n][n];ull get_h (int l,int r) {return hs[r]-hs[l-1]*pw[r-l+ 1];} int get_w (int x) {int res=0;while (x) X/=10,res++;return res;} int main () {scanf ("%s", s+1); N=strlen (s+1); F (I,1,n) hs[i]=hs[i-1]*bas+s[i]; Pw[0]=1; F (i,1,n) Pw[i]=pw[i-1]*bas; Memset (Dp,0x3f,sizeof (DP)); F (i,1,n) dp[i][i]=1; F (len,2,n) for (Re int i=1,j=len;j<=n;i++,j++) {F (k,i,j-1) dp[i][j]=min (Dp[i][j],dp[i][k]+dp[k+1][j]); F (K,1,len) if (len%k==0) {ull val=get_h (i,i+k-1); bool fla=0; FoR (int l=i+k;l<=j;l+=k) if (Get_h (l,l+k-1)!=val) {fla=1;break;} if (!FLA) dp[i][j]=min (Dp[i][j],2+dp[i][i+k-1]+get_w (len/k)); }} printf ("%d", dp[1][n]); return 0;}
[luogu1090 SCOI2003] string collapse (interval Dp+hash)