码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4850 Wow! Such String!(字符串处理,yy)

时间:2014-07-11 19:59:50      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   art   

题目

 

 

参考了博客http://blog.csdn.net/u013368721/article/details/37575165

 

 

 

bubuko.com,布布扣
//用visit[26][26][26][26]来判断新家新区的子母河前三个组合而成的4个字符的串是否和之前的重复。
//再加上最初三个字符,所以,总共有26*26*26*26+3的长度。

/*
//以下复制自博客http://blog.csdn.net/u013368721/article/details/37575165
题目大意:给你一个整数n,让你输出一个字符串。必须满足以下条件:
1.字符串的长度为n。
2.这个字符串只包含小写字母。
3.字符串中长度大于等于4的子串最多只能出现一次。
如果无解输出Impossible。

题目分析:
这题我们就是提出猜想过掉的。。
因为大于等于4的子串只能出现一次,所以想到串最长只会达到26*26*26*26+3 = 456979的长度。
一开始是想到了AC自动机,想在AC自动机上每走三个结点就回到根。。可是这根本做不到= =于是又诞生了另一种奇葩的方法——每增加一个字母时从a~z for一遍,看这个字母会不会和前三个字母构成的子串在之前的串中已经出现,如果未出现过,那么这个位置上就决定是这个字母了,然后下个位置直接从接下去的字母中选取;如果已经出现相同子串则枚举下个字母,如果一直到z还是不能添加一个字母到本位置但是这次a~z中已经有至少一个添加到之前的位置上时,重头再for,否则结束循环(因为已经枚举完所有的26个字母且都已经与前面三个字母构成的子串出现过了)。一开始我们设的aaa作为起始串,然后输出最后得到的串的长度达到了456954!无限接近,然后输出还没有添加到串中的字母一看,竟然除了a,所有四个相同字母如bbbb,cccc等都没有添加进去。。。然后就机智的将它们全部放到前面去,再次输出一看,最长串长度正好456979!问题解决。(至此我也明白了四个字母的子串只出现一次的主串长度最长能达到(26 ^ 4) + 3 )

PS:可以大胆的猜想,可以有x个不同字符的长度大于等于m(m <= x)的子串最多只能出现一次的主串的最长长度可以达到(x ^ m) + m - 1!证明留待后人。
*/

#include<stdio.h>
#include<string.h>
#include<string>
int  N=26*26*26*26+3;
char s[500010] ="aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz";
int vis[26][26][26][26];
void init()
{
    memset(vis,0,sizeof(vis));
    int len=26*4;
    int flag=1;
    for(int i=3;i<len;i++)
    {
        vis[s[i-3]-a][s[i-2]-a][s[i-1]-a][s[i]-a]=1;
    }
    while(flag)
    {
        flag=0;
        for(int i=0;i<26;i++)
        {
            if(!vis[s[len-3]-a][s[len-2]-a][s[len-1]-a][i]) 
            {
                s[len]=i+a;
                vis[s[len-3]-a][s[len-2]-a][s[len-1]-a][i]=1;
                len++;
                flag=1;
            }
        }
    }
}
int main()
{
    int n,len;
     init();
    
    while(~scanf("%d",&n))
    {
        if(n>N)printf("Impossible");
        else
        {
            for(int i=0;i<n;i++)
                printf("%c",s[i]);
        }
        puts("");
    }
    return 0;
}
View Code

 

hdu 4850 Wow! Such String!(字符串处理,yy),布布扣,bubuko.com

hdu 4850 Wow! Such String!(字符串处理,yy)

标签:style   blog   http   color   os   art   

原文地址:http://www.cnblogs.com/laiba2004/p/3833416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!