http://acm.hdu.edu.cn/showproblem.php?pid=4850
西安邀请赛当时没做出来的银牌门坎题
题意:构造一个长度n的字符串,长度>=4的子串只能出现一次
题解:暴力枚举构造,复杂度是O(最长字符串长度*26),注意到最长字符串长度是26^4+3,因为长度为4的字符串共有26^4种,每种占一个起点,最后加3。注意暴力构造时aaaa,bbbb这种不会被构造出来,要提前加上
#include <iostream> #include <cstdio> #include <cstring> using namespace std ; int ans[500005] ; int vis[26][26][26][26] ; int main() { int n ; int len=0 ; int OK=1 ; for(int i=0 ;i<26 ;i++) for(int j=0 ;j<4 ;j++) ans[len++]=i ; for(int i=0 ;i<len-3 ;i++) vis[ans[i]][ans[i+1]][ans[i+2]][ans[i+3]]=1 ; while(OK) { OK=0 ; for(int i=0 ;i<26 ;i++) { if(!vis[ans[len-3]][ans[len-2]][ans[len-1]][i]) { vis[ans[len-3]][ans[len-2]][ans[len-1]][i]=1 ; ans[len++]=i ; OK=1 ; } } } while(~scanf("%d",&n)) { if(n>len)puts("Impossible") ; else { for(int i=0 ;i<n ;i++) printf("%c",ans[i]+'a') ; putchar('\n') ; } } return 0 ; }