【NOIP2012模擬11.7】祕密檔案
Description
某天,情報局得到了一份祕密檔案。檔案的內容是加密後的全部由大寫字母組成字串。情報局局長小明想將其傳送給遠在東方神祕的XX大陸上的老朋友小劉來解密。然而若字串太長,則需要很長的傳送時間,太不安全了,因此小明想盡量將其縮短。於是小明制定了這樣一個縮短規則:若一個字串t連續出現k次,則可以用k(t)進行說明。如ABABAB可以縮成3(AB)。當然,重複縮短是允許的,如ABABABAAAAAAABABABAAAAAA可以縮成2(3(AB)6(A))
現在,小明想知道,對於給定的字串,最短可以縮成什麼樣子。
Input
輸入僅一行,為給定的字串。
Output
輸出僅一行,為經過縮短操作後的字串。
若有多解,輸出任意解即可。
Sample Input
AAAAAAAAAABABABCCD
Sample Output
9(A)3(AB)CCD
**Data Constraint
Hint**
對於100%的資料,字串的長度L<=100。
The Solution
此題為經典DP題
用f[i][j]表示原串中第i位至第j位經過處理後能壓縮成的最短字串。
對於f[i][j]的處理,顯然是可以直接使用原串的。
然後我們可以列舉斷點,由f[i][k]和f[k+1][j]拼接之後來更新f[i][j]。
最後,檢測原串中i~j這一段是否由重複的子串構成。
如果是,也能更新f[i][j]。
注意到對於狀態f[i][j],若i=j,此狀態必然是廢狀態,可以直接去掉。所以我們可以計算出所有情況的排位。對於狀態f[i][j],若i>j,則此狀態不存在,否則該狀態的排位為j*(j-1)/2+i。這樣就能優化掉一半的空間了。
最後答案ans即為f[1][len]。
Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define fd(i,a,b) for (int i=a;i>=b;i--)
#define INF 2147483647
#define N 105
using namespace std;
char s[N];
int F[N][N];
string ans[N][N];
bool bz[N][N];
inline int read()
{
int x=0,w=1;
char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*w;
}
bool Check(int l,int r,int ll,int rr)
{
if ((r-l+1)%(rr-ll+1)!=0) return false;
fo(i,l,r)
if (s[i]!=s[(i-l)%(rr-ll+1)+ll]) return false;
return true;
}
int Ask(int x){int y=0;for (;x;x/=10) y++;return y;}
string Get(int x){string t;for (;x;x/=10) t=char(x%10+'0')+t;return t;}
int Dp(int l,int r)
{
if (bz[l][r]) return F[l][r];
if (l==r)
{
ans[l][r]=s[l];
return 1;
}
bz[l][r]=true;
int mn=r-l+1;
fo(i,l,r) ans[l][r]+=s[i];
fo(i,l,r-1)
{
int temp=Dp(l,i)+Dp(i+1,r);
if (temp<mn)
{
mn=temp;
ans[l][r]=ans[l][i]+ans[i+1][r];
}
if (Check(i+1,r,l,i))
{
int temp=Dp(l,i)+Ask((r-i)/(i-l+1)+1)+2;
if (temp<mn)
{
mn=temp;
ans[l][r]=Get((r-i)/(i-l+1)+1)+"("+ans[l][i]+")";
}
}
}
return F[l][r]=mn;
}
int main()
{
scanf("%s",s+1);
int l=strlen(s+1);
Dp(1,l);
cout<<ans[1][l]<<endl;
return 0;
}
相關文章
- 模擬一個大檔案
- 室友的Zip加密檔案探祕,Python解決Zip加密檔案探索祕密!加密Python
- 模擬資料檔案丟失
- modelsim指令碼模擬設計(三)帶標頭檔案模擬指令碼
- 給 iOS 模擬器 “安裝”app 檔案iOSAPP
- Python模擬HTTP Post上傳檔案PythonHTTP
- 專案投標的祕密薦
- 模擬控制檔案丟失進行恢復。
- IBM欲造首個模擬人腦 探詢人類思考記憶祕密[zz]IBM
- 成功專案管理的祕密(轉)專案管理
- Windows 下使用檔案模擬磁碟配置ASM磁碟組WindowsASM
- Dark Overlord黑客釋出了第一批“祕密”9·11檔案黑客
- Facebook祕密檔案洩露:賺錢(和背鍋)是AI的使命AI
- 小技巧:onchange事件+iframe模擬非同步檔案上傳事件非同步
- React 模態框祕密和“輪子”漸進設計React
- [轉] PERL模擬飛鴿傳書檔案傳輸總結
- 11.7
- PAT-B 1067 試密碼【模擬】密碼
- Oracle 密碼檔案Oracle密碼
- 探祕 Mach-O 檔案Mac
- Eventloop的祕密OOP
- Redis小祕密Redis
- 破解梵蒂岡祕密檔案,這個AI認識中世紀手寫拉丁文AI
- 模擬輸入密碼時顯示‘*’,然後將密碼輸出密碼
- [TIL] 在 Finder 中開啟 iOS 模擬器的檔案系統iOS
- 【RMAN】SYSTEM表空間資料檔案丟失恢復模擬
- 【原創】模擬控制檔案丟失的資料庫恢復資料庫
- 關於密碼檔案,SYS密碼密碼
- PAT-B 1081 檢查密碼【模擬】密碼
- Oracle:ASM & 密碼檔案OracleASM密碼
- 建立oracle 密碼檔案Oracle密碼
- 神祕的.user.ini檔案
- C#專案—模擬考試C#
- 11.7日
- linux下如何使用檔案來模擬硬碟進行ASM測試Linux硬碟ASM
- 資料庫啟動時丟失資料檔案模擬實驗資料庫
- 圖靈無祕密圖靈
- 實戰模擬│揭祕為啥年會你抽不到特等獎