HDU 4850 Wow! Such String!

题目链接

题意:求50W内的字符串。要求长度大于等于4的子串,仅仅出现一次

思路:须要推理。考虑4个字母的字符串,一共同拥有26^4种,这些由这些字符串。假设一个字符串末尾加上一个字符。能够变成还有一个字符串的话,就当作这有一条边,每多一个字符多一个结点,那么对于这道题目,一共就能有26^4 + 3条边,在加上尾巴能够多放3个,一共是26^4+3个边。这些边所有连起来就是要的字符串,这样就能够知道每一个节点会经过的次数为26,这样就仅仅要考虑怎样把这些节点串起来,形成一个欧拉道路就可以,这样情况是最大的。选一个起始点aaa,不断往后走,每次选择被占用最少的节点去走,边都标记掉,然后要有一个注意点,就是因为是从aaa開始走。最后必须回到aaa。所以要让选择a这条边的优先级变成最小,不然假设先被占用了就无法构成了

代码:

#include <cstdio>
#include <cstring> const int N = 20005;
int vis[N], vis2[N][30], on = 0;
char out[500005]; int getnext(int x, int a) {
return x % (26 * 26) * 26 + a;
} void init() {
int now = 0;
for (int i = 0; i < 3; i++)
out[on++] = 'a';
while (true) {
int Min = 26, iv = 0;
for (int i = 1; i < 26; i++) {
if (vis2[now][i]) continue;
int tmp = getnext(now, i);
if (vis[tmp] < Min) {
Min = vis[tmp];
iv = i;
}
}
int tmp = getnext(now, iv);
if (vis[tmp] == 26) break;
vis2[now][iv] = 1;
now = tmp;
vis[now]++;
out[on++] = now % 26 + 'a';
}
} int n; int main() {
init();
while (~scanf("%d", &n)) {
if (n > 456979) printf("Impossible\n");
else printf("%s\n", (out + 456979 - n));
}
return 0;
}

最新文章

  1. Linux初识
  2. androidannotations 简单复制与点击事件(1)
  3. Struts2 动态方法调用
  4. 前端二:CSS
  5. CSS 图片倾斜的制作
  6. msconfig设置调试开启 关闭 操作注册表项是
  7. [杂谈]交通工具orca card
  8. union 和 union all 的区别
  9. Js 中json简单处理
  10. poj 3278 Catch That Cow (bfs搜索)
  11. Redis .NET开源组件Beetle.Redis
  12. JS-如何把字符串转换成数组
  13. 在Angular中,如果权限值是异步请求所得,如何将其设置为HTTP请求头的Authorization?
  14. MQTT在react-native中的运行
  15. 【hdu 5632】Rikka with Array
  16. java中定时执行任务
  17. px 与 dp, sp换算公式?(转)
  18. 极域电子教室卸载或安装软件后windows7无法启用触摸板、键盘
  19. Nginx作为反向代理服务器
  20. TIDB介绍 新数据库趋势

热门文章

  1. 在计算机中简单的hello程序的运行
  2. C++ 类 直接定义对象与new对象的区别
  3. ExecutorService 线程池 (转发)
  4. 用java实现二分搜索&lt;算法分析&gt;
  5. python标准库笔记
  6. iOS点击cell时,控件背景色消失的解决方法
  7. [bzo1211][HNOI2004]树的计数_prufer序列
  8. AtCoder Grand Contest 011 E - Increasing Numbers(灵性乱搞)
  9. java反射与注解结合使用(根据传入对象输出查询sql)
  10. sql语句在Mysql中如何执行?