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 ;
}
View Code