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[] ;
int vis[][][][] ; int main()
{
int n ;
int len= ;
int OK= ;
for(int i= ;i< ;i++)
for(int j= ;j< ;j++)
ans[len++]=i ;
for(int i= ;i<len- ;i++)
vis[ans[i]][ans[i+]][ans[i+]][ans[i+]]= ;
while(OK)
{
OK= ;
for(int i= ;i< ;i++)
{
if(!vis[ans[len-]][ans[len-]][ans[len-]][i])
{
vis[ans[len-]][ans[len-]][ans[len-]][i]= ;
ans[len++]=i ;
OK= ;
}
}
}
while(~scanf("%d",&n))
{
if(n>len)puts("Impossible") ;
else
{
for(int i= ;i<n ;i++)
printf("%c",ans[i]+'a') ;
putchar('\n') ;
}
}
return ;
}