/************************************************************** Problem: 1068 User: lxy8584099 Language: C++ Result: Accepted Time:20 ms Memory:900 kb****************************************************************/ /* 胡乱DP hash f i,j,k 表示 i~j 有没有M的最小长度 默认在i-1处有一个M 这样由子问题转到最后的问题 1-1即0处就存在一个M 这样操作不影响转移 */#include#include #define ll unsigned long longusing namespace std;const int N=100;ll B=233,base[N]={ 1},s[N];char str[N];int f[N][N][2],n;int min(int a,int b) { return a>b?b:a;} ll hash(int l,int r){ return s[r]-s[l-1]*base[r-l+1];}int main(){ memset(f,0x3f,sizeof(f)); scanf("%s",str+1); n=strlen(str+1); for(int i=1;i<=n;i++) { base[i]=base[i-1]*B; s[i]=s[i-1]*B+str[i]; } for(int i=n;i>=1;i--) for(int j=i;j<=n;j++) { f[i][j][0]=f[i][j][1]=j-i+1; for(int k=i;k >1; if((j-i+1)%2==0&&hash(i,mid)==hash(mid+1,j)) f[i][j][0]=f[i][mid][0]+1; // 需要一个R //能缩就缩 } printf("%d\n",min(f[1][n][0],f[1][n][1])); return 0;}