• 12333 - Revenge of Fibonacci (UVA)


    题目链接如下:

    Online Judge

    全网只有我一个人是用这种笨办法解出来的吗……耗时9秒多卡进10秒AC.....

    字典树啥的我都没学过不懂...需要学习一下。

    代码如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. // #define debug
    7. const int maxx = 100000;
    8. int T;
    9. std::string s;
    10. std::unordered_mapint> mp;
    11. std::vector vec(maxx);
    12. char toSum[70];
    13. int toCarry[70];
    14. void fibo(int k) {
    15. int i, j, carry = 0;
    16. int sz = std::min(vec[k - 2].size(), vec[k - 1].size());
    17. for (i = 0; i < sz; ++i) {
    18. int temp = vec[k - 2][i] + vec[k - 1][i] + carry - '0';
    19. carry = toCarry[temp];
    20. vec[k].push_back(toSum[temp]);
    21. }
    22. if (vec[k - 2].size() != vec[k - 1].size()) {
    23. j = sz == vec[k - 2].size() ? 1 : 2;
    24. sz = vec[k - j].size();
    25. while (i < sz) {
    26. int temp = vec[k - j][i] + carry;
    27. carry = toCarry[temp];
    28. vec[k].push_back(toSum[temp]);
    29. ++i;
    30. }
    31. }
    32. if (carry) {
    33. vec[k].push_back('1');
    34. }
    35. std::string temp;
    36. sz = std::max(0, (int)vec[k].size() - 40);
    37. for (i = vec[k].size() - 1; i >= sz; --i) {
    38. temp.push_back(vec[k][i]);
    39. if (mp.find(temp) == mp.end()) {
    40. mp[temp] = k;
    41. }
    42. }
    43. }
    44. int main() {
    45. #ifdef debug
    46. freopen("0.txt", "r", stdin);
    47. freopen("1.txt", "w", stdout);
    48. #endif
    49. for (int i = 48; i <= 57; ++i) {
    50. toCarry[i] = 0;
    51. toSum[i] = i;
    52. }
    53. for (int i = 58; i <= 67; ++i) {
    54. toCarry[i] = 1;
    55. toSum[i] = i - 10;
    56. }
    57. vec[0] = vec[1] = "1";
    58. mp[vec[0]] = 0;
    59. for (int i = 2; i < 100000; ++i) {
    60. fibo(i);
    61. }
    62. scanf("%d", &T);
    63. for (int i = 1; i <= T; ++i) {
    64. std::cin >> s;
    65. printf("Case #%d: %d\n", i, mp.find(s) != mp.end() ? mp[s] : -1);
    66. }
    67. #ifdef debug
    68. fclose(stdin);
    69. fclose(stdout);
    70. #endif
    71. return 0;
    72. }

    试着用字典树改了一下,还需要五秒多……代码如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. // #define debug
    6. const int maxx = 100000;
    7. struct trieNode{
    8. int key = -1;
    9. trieNode* son[10] = {nullptr};
    10. };
    11. trieNode* root = new trieNode;
    12. int T;
    13. std::string s;
    14. std::vector vec(maxx);
    15. char toSum[70];
    16. int toCarry[70];
    17. void insert(std::string ss, int k){
    18. trieNode *curr = root;
    19. ss = ss.substr(0, 40);
    20. for (int i = 0; i < ss.size(); ++i){
    21. if (!curr->son[ss[i] - '0']){
    22. trieNode *temp = new trieNode;
    23. temp->key = k;
    24. curr->son[ss[i] - '0'] = temp;
    25. }
    26. curr = curr->son[ss[i] - '0'];
    27. }
    28. }
    29. int trieFind(std::string ss){
    30. trieNode *curr = root;
    31. for (int i = 0; i < ss.size(); ++i){
    32. if (!curr->son[ss[i] - '0']){
    33. return -1;
    34. }
    35. curr = curr->son[ss[i] - '0'];
    36. }
    37. return curr->key;
    38. }
    39. void fibo(int k) {
    40. int i, j, carry = 0;
    41. int sz = std::min(vec[k - 2].size(), vec[k - 1].size());
    42. for (i = 0; i < sz; ++i) {
    43. int temp = vec[k - 2][i] + vec[k - 1][i] + carry - '0';
    44. carry = toCarry[temp];
    45. vec[k].push_back(toSum[temp]);
    46. }
    47. if (vec[k - 2].size() != vec[k - 1].size()) {
    48. j = sz == vec[k - 2].size() ? 1 : 2;
    49. sz = vec[k - j].size();
    50. while (i < sz) {
    51. int temp = vec[k - j][i] + carry;
    52. carry = toCarry[temp];
    53. vec[k].push_back(toSum[temp]);
    54. ++i;
    55. }
    56. }
    57. if (carry) {
    58. vec[k].push_back('1');
    59. }
    60. std::string temp;
    61. sz = std::max(0, (int)vec[k].size() - 40);
    62. for (i = vec[k].size() - 1; i >= sz; --i) {
    63. temp.push_back(vec[k][i]);
    64. }
    65. insert(temp, k);
    66. }
    67. int main() {
    68. #ifdef debug
    69. freopen("0.txt", "r", stdin);
    70. freopen("1.txt", "w", stdout);
    71. #endif
    72. for (int i = 48; i <= 57; ++i) {
    73. toCarry[i] = 0;
    74. toSum[i] = i;
    75. }
    76. for (int i = 58; i <= 67; ++i) {
    77. toCarry[i] = 1;
    78. toSum[i] = i - 10;
    79. }
    80. vec[0] = vec[1] = "1";
    81. insert(vec[0], 0);
    82. for (int i = 2; i < 100000; ++i) {
    83. fibo(i);
    84. }
    85. scanf("%d", &T);
    86. for (int i = 1; i <= T; ++i) {
    87. std::cin >> s;
    88. printf("Case #%d: %d\n", i, trieFind(s));
    89. }
    90. #ifdef debug
    91. fclose(stdin);
    92. fclose(stdout);
    93. #endif
    94. return 0;
    95. }

  • 相关阅读:
    oracle安装RAC手动配置互信
    性能优化篇(四) GPU Instancing
    从 internal 修饰符一探 kotlin 的可见性控制
    CI2454 2.4g无线MCU芯片应用
    (c语言)整形提升
    JavaScript进阶-函数(参数,箭头函数)
    《算法导论》第17章-摊还分析 17.1 聚合分析 && 17.2 核算法&&17.3 势能法
    代码随想录第46天 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离
    Docker 安装HomeAssistant智能家居系统
    mybatiesHelperPro工具必须的可以生成到对应项目文件夹下
  • 原文地址:https://blog.csdn.net/linh2006/article/details/134335319