当前位置:   article > 正文

P2246 SAC#1 - Hello World(升级版)

P2246 SAC#1 - Hello World(升级版)

网址如下:

P2246 SAC#1 - Hello World(升级版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

刚开始是用递归做的,虽然用了哈希表优化,但是超时,只得了50

后面想到了一个新的算法,时间复杂度接近O(n)

设置一个数组记录长度为n的字串的数量,然后得到一个新的字符时,从“helloworld”的后面往前检测,当匹配的时候该长度的数量加上前一个长度的数量(记得取余)

50分的代码如下:

  1. #include<stdio.h>
  2. #include<ctype.h>
  3. #define NUM 1000000007
  4. #define LEN 9
  5. bool judge(char c);
  6. void dg(int et, int loc);
  7. char str[] = "helloworld";
  8. int result, count, list[26][500001];
  9. int main(void)
  10. {
  11. //输入并处理
  12. {
  13. char c;
  14. int loc[26] = {0};
  15. while((c = getchar()) != EOF)
  16. if(judge(c))
  17. {
  18. c = tolower(c), count++;
  19. int tmp = c - 'a';
  20. for(int i = loc[tmp] + 1; i <= count; i++)
  21. list[tmp][i] = count;
  22. loc[tmp] = count;
  23. }
  24. }
  25. //枚举递归
  26. dg(0, 0);
  27. //输出
  28. printf("%d", result);
  29. return 0;
  30. }
  31. bool judge(char c)
  32. {
  33. if(!isalpha(c)) return false;
  34. c = tolower(c);
  35. if(c == 'h' || c == 'e' || c == 'l' || c == 'o' || c == 'w' || c == 'r' || c == 'd')
  36. return true;
  37. return false;
  38. }
  39. void dg(int et, int loc)
  40. {
  41. int tmp = str[et] - 'a';//想要的字母的id
  42. if(!list[tmp][loc + 1]) return;//没有想要的字母了
  43. else
  44. {
  45. while(list[tmp][loc + 1])
  46. {
  47. loc = list[tmp][loc + 1];
  48. if(et == LEN)//helloworld子串构成了
  49. result = (result + 1) % NUM;
  50. else
  51. dg(et + 1, loc);
  52. }
  53. }
  54. return;
  55. }

100分代码如下:

  1. #include<stdio.h>
  2. #include<ctype.h>
  3. bool judge(char c);
  4. void process(char c);
  5. char str[] = " helloworld";
  6. int quantity[11] = {1};//长度为n的字串目前有几个
  7. const int NUM = 1000000007;
  8. int main(void)
  9. {
  10. //输入并处理
  11. {
  12. char c;
  13. while((c = getchar()) != EOF)
  14. if(judge(c))
  15. process(tolower(c));
  16. }
  17. //输出
  18. printf("%d", quantity[10]);
  19. return 0;
  20. }
  21. bool judge(char c)
  22. {
  23. if(!isalpha(c)) return false;
  24. c = tolower(c);
  25. if(c == 'h' || c == 'e' || c == 'l' || c == 'o' || c == 'w' || c == 'r' || c == 'd')
  26. return true;
  27. return false;
  28. }
  29. void process(char c)
  30. {
  31. for(int i = 10; i; i--)
  32. if(c == str[i])
  33. quantity[i] = (quantity[i] + quantity[i - 1]) % NUM;
  34. return;
  35. }

一些废话:

我为什么要做这题呢,是当时我表哥刚开始学C,我就说你已经可以输出helloworld了,而且洛谷应该有相应的题,结果看难度都是挺高的。。。

选了这题来做

我又是怎么想到这个新算法呢,那就不得不吐槽一下傻逼普通的科三考试,预约考试时间是9:00-10:30,我9:00到的,等了三个多小时,最后还是没过,还要被折磨至少一次

中途闲着没事干想起这题就试着想新算法了

md

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45200
推荐阅读
相关标签
  

闽ICP备14008679号