hdu1274 展開字串

2021-08-15 21:15:34 字數 1262 閱讀 8934

在紡織cad系統開發過程中,經常會遇到紗線排列的問題。

該問題的描述是這樣的:常用紗線的品種一般不會超過25種,所以分別可以用小寫字母表示不同的紗線,例如:abc表示三根紗線的排列;重複可以用數字和括號表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括號前面沒有表示重複的數字出現,則就可認為是1被省略了,如:cd(abc)=cd1(abc)=cdabc;這種表示方法非常簡單緊湊,也易於理解;但是計算機卻不能理解。為了使計算機接受,就必須將簡單緊湊的表達方式展開。某acm隊接受了此項任務。現在你就是該acm隊的一員,請你把這個程式編寫完成。

已知條件:輸入的簡單緊湊表達方式的長度不超過250個字元;括號前表示重複的數不超過1000;不會出現除了數字、括號、小寫字母以外的任何其他字元;不會出現括號不配對等錯誤的情況(錯誤處理已由acm其他隊員完成了)。

本題有多個測試資料組,第一行輸入的就是資料組數n,接著就是n行表示式,表示式是按照前面介紹的意義書寫的。

輸出時含有n行,每行對應乙個輸入的表示式。

21(1a2b1(ab)1c)

3(ab2(4ab))

abbabc

abaaaabaaaababaaaabaaaababaaaabaaaab

掃瞄字串:

1、字母:直接輸出

2、左括號:以一倍遞迴處理括號內字串

3、數字:先確定倍數n(可能不止一位,雖然本題僅僅考慮一位數也能ac),如果n後面跟的是字母,輸出n遍,繼續掃瞄,如果為左括號,遞迴。

#include #include #include #include #include using namespace std;

#define inf 0x3f3f3f3f

char s[260];

int tmp;

int ykh(int p) //找到對應的右括號

}void cf(int n,int l,int r)

if(s[p]>='a'&&s[p]<='z')

{for(j=1;j<=total;j++)

cout<>n;

while(n--)

{tmp=0;

cin>>s+1;

s[0]='('; //在原字串基礎上新增左右括號,便於遞迴

tmp=strlen(s);

s[tmp]=')';

s[tmp+1]='\0';

cf(1,0,tmp);

cout<

hdu 1274 展開字串

problem description 在紡織cad系統開發過程中,經常會遇到紗線排列的問題。該問題的描述是這樣的 常用紗線的品種一般不會超過25種,所以分別可以用小寫字母表示不同的紗線,例如 abc表示三根紗線的排列 重複可以用數字和括號表示,例如 2 abc 表示abcabc 1 a 1a表示a...

HDU 1274 展開字串

problem description 在紡織cad系統開發過程中,經常會遇到紗線排列的問題。該問題的描述是這樣的 常用紗線的品種一般不會超過25種,所以分別可以用小寫字母表示不同的紗線,例如 abc表示三根紗線的排列 重複可以用數字和括號表示,例如 2 abc 表示abcabc 1 a 1a表示a...

HDU 1274(展開字串)

使用棧儲存輸入的字元,每次讀取乙個字元,分情況操作 字元為數字和左括號,直接入棧 字元為小寫字母,如果棧頂元素不是數字,直接入棧 如果棧頂元素是數字,將當前字母展開 棧 字元為右括號,將字元依次出棧並存入臨時陣列,直到棧頂元素為左括號,將左括號出棧並捨棄。如果左括號前有數字,則將其出棧 如果左括號前...