題意:
輸入正整數n,l,輸出由前l個字元組成的,字典序第k小的沒有兩個相鄰重複子串的串。
要點:判斷abcaba是否包含重複子串的方法是這樣的:運用回溯法,只要比較當前串字尾,因為回溯法的特性,我們只要考慮當前的情況即可,前面的不用管,這樣遞迴可以保證從頭到尾都是成立的,當然字尾要從乙個比較到n+1/2個(奇數多考慮乙個),例如:abcaba,先比較a與前面的b,再比較ba與ca,以此類推。
注意這裡有乙個非常難想到的地方:我們遞推考慮的是往字串上乙個個加字母,但有時會出現加上去的字母都不滿足的情況,如:abacaba,不管加a,b,c都不行,這時候輸出的應該是返回前乙個的值abacabc,所以多設乙個值num儲存字典序,cur儲存個數。
**如下:
#include#includeint s[100];
int n, l,num;//用num儲存字典序
bool judge(int cur)
if (flag) //說明某一字尾長度時出現相同的情況,說明不合法
return false;
} return true;
}void output(int cur)
putchar(s[i]);
} printf("\n%d\n", cur + 1);
}bool dfs(int cur)//cur為字母個數
if (dfs(cur+1))
return true;
} } return false; }
int main()
}
uva 129 困難的串
題目大意 如果乙個字串包含兩個相鄰的重複子串,則稱它是 容易的串 其他串稱為 困難的串 列如,bb,abcdacabcab,abcdabcd都是容易的串,而d,dc,abdab都是困難的串 輸入正整數n和l,輸出由前l個字元組成的,字典序第n小的困難的串 include include includ...
uva 129 困難的串
先想出最簡單的解法 列舉字母串 書中所介紹的遞迴排列列舉演算法 每次產生乙個新串都進行檢查。檢查是否 困難 的方法是 外層迴圈列舉子串長度 中層迴圈列舉左側子串的起始位置 內層迴圈列舉子串中的字元的位置直覺上來說,這個方法就太笨重了。實際上這個方法進行了很多重複的工作 每次在原有字母串基礎上增加一位...
UVa129 困難的串
輸入依舊是坑。include include include include includeusing namespace std int n,l int cnt int s 100 int dfs int cur 表示排到第cur個字元 printf c a s i printf n d n cu...