标签:算法 字符串 min gre code color alt sed 有一个
输入字符串S(S的长度<= 5000)。
输出最少的划分数量。
abbaabaa
3
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define MOD 1000000007 5 #define MX 5005 6 7 int n; 8 int len; 9 char temp[MX]; 10 char str[MX*2]; 11 int p[MX*2]; 12 int dp[MX*2]; 13 14 void Init() 15 { 16 len = 0; 17 str[len++]=‘@‘; 18 str[len++]=‘#‘; 19 n = strlen(temp); 20 for (int i=0;i<n;i++) 21 { 22 str[len++]=temp[i]; 23 str[len++]=‘#‘; 24 } 25 memset(p,0,sizeof(p)); 26 } 27 28 void Manacher() 29 { 30 Init(); 31 int mx = 0, id =0; 32 for (int i=1;i<len;i++) 33 { 34 p[i] = mx>i ? min(p[2*id-i],mx-i):1; 35 while (str[i+p[i]]==str[i-p[i]]) p[i]++; 36 if (i+p[i]>mx) 37 { 38 mx = i+p[i]; 39 id = i; 40 } 41 } 42 } 43 44 int main() 45 { 46 while (scanf("%s",temp)!=EOF) 47 { 48 Manacher(); 49 50 for (int i=0;i<n;i++) 51 { 52 dp[i] = i+1; //初值 53 int pos = (i+1)*2; 54 for (int j=pos;j>=1;j--) 55 { 56 if(j+p[j]-2>=pos) 57 { 58 int pre = (j-(pos-j))/2-1; 59 if (pre==0) dp[i]=1; 60 else dp[i]= min(dp[pre-1]+1,dp[i]); 61 } 62 } 63 } 64 printf("%d\n",dp[n-1]); 65 } 66 return 0; 67 }
标签:算法 字符串 min gre code color alt sed 有一个
原文地址:http://www.cnblogs.com/haoabcd2010/p/7638295.html