HDU 4850

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

 

你可能感兴趣的:(HDU)