uva 1630 KMP判断周期串 和 区间DP 压缩字符串

来源:互联网 发布:win7与linux双系统 编辑:程序博客网 时间:2024/06/16 02:43
#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>using namespace std;string dp[160][160];char s[160],t[160];int f[160];string ToString(int x){string res = "";while(x){res += (char)('0' + (x % 10));x /= 10;}reverse(res.begin(),res.end());return res;}void GetFail(char *s){int len = strlen(s);f[0] = f[1] = 0;for(int i = 1;i < len;i++){int j = f[i];while(j && s[i] != s[j]) j = f[j];f[i+1] = s[i] == s[j] ? j+1:0;}}int main(){while(scanf("%s",s) == 1){int len = strlen(s);for(int i = 0;i < len;i++)dp[i][i] = string("") + s[i];for(int l = 2;l <= len;l++){for(int i = 0;i + l - 1 < len;i++){int j = i + l - 1;dp[i][j]="";for(int k = i;k <= j;k++){dp[i][j] += s[k];t[k-i] = s[k];}t[j-i+1] = 0;GetFail(t);if(l % (l - f[l]) == 0){int n = l - f[l];string tt="";tt = ToString(l / n);tt += '(';tt += dp[i][i+n-1];tt += ')';if(tt.length() < dp[i][j].length()) dp[i][j] = tt;}for(int k = i;k < j;k++){if(dp[i][k].length() + dp[k+1][j].length() < dp[i][j].length()){dp[i][j] = dp[i][k] +dp[k+1][j];}}}}cout<<dp[0][len-1]<<endl;}}

原创粉丝点击