博客
关于我
打表与活用递推
阅读量:532 次
发布时间:2019-03-08

本文共 1405 字,大约阅读时间需要 4 分钟。

对于字符串问题,寻找三字符组成的“PAT”形式的个数是一个典型的需要高效处理的任务。直接暴力方法感兴趣慢,前方小编尝试采用预处理技术和递推思想,最终成功找到了一种有效解决方案。

一、打表与递推技术

在这个问题中,打表技术被巧妙地运用,有助于预先计算各个位置的关键信息。通过一次前后遍历,预处理出每个位置左边的P个数和右边的T个数。然后,这些预处理的数据可以快速被用于计算每个A节点对最终结果贡献。

具体步骤:

  • 预处理左边P数量:从左到右遍历字符串,记录每个位置左边(含本位)连续出现的P的数量。这一步通过一次线性遍历即可完成。

  • 计算A的贡献:从右到左遍历字符串,维护一个记录当前右边T的数量。每遇到一个A,就计算该A所能形成的PAT的数量,即左边P数量乘以右边T数量,并将结果累计到最终答案中。

  • 二、代码实现

    具体实现如下:

    #include 
    #include
    const int MAXN = 100005;const int MOD = 1000000007;int main() { char str[MAXN]; gets(str); int len = strlen(str); int* leftP = new int[len]{0}; for (int i = 0; i < len; ++i) { if (i == 0) { if (str[i] == 'P') leftP[i] = 1; else leftP[i] = 0; } else { if (str[i] == 'P') leftP[i] = leftP[i-1] + 1; else leftP[i] = leftP[i-1]; } } int ans = 0; int rightT = 0; for (int i = len - 1; i >= 0; --i) { if (str[i] == 'T') { rightT++; } else if (str[i] == 'A') { ans = (ans + leftP[i] * rightT) % MOD; } } printf("%d\n", ans); delete[] leftP; return 0;}

    三、谨慎处理细节

    在代码实现中,需要仔细注意以下几点:

  • 初始化问题:确保左边P数组的初始值正确,尤其是首位的情况。

  • 取模处理:每次累加时都应及时取模,防止数值溢出,并符合题目要求。

  • 遍历方向:右边T的数量需要从右向左统计,以确保每个A的右边T数目正确。

  • 空间复杂度:预处理后的数组虽然占用了额外的空间,但在处理过程中是必要的。需确保数组的大小适中,可以正确处理最大输入长度。

  • 这种方法通过预处理和递推巧妙地将一个看似复杂的问题转化为简单的线性时间计算,大幅提高了效率,适用于处理较大数据规模的问题。

    转载地址:http://qtsiz.baihongyu.com/

    你可能感兴趣的文章
    php生成二维码到图片上
    查看>>
    php生成二维码并下载图片(适应于框架)
    查看>>
    PHP线程安全和非线程安全
    查看>>
    php缃戠珯,www.wfzwz.com
    查看>>
    php编写TCP服务端和客户端程序
    查看>>
    PHP编程效率的20个要点
    查看>>
    PHP网页缓存技术优点及代码
    查看>>
    php自定义函数: 文件大小转换成智能形式
    查看>>
    R3.4.0安装包时报错“需要TRUE/FALSE值的地方不可以用缺少值”,需升级到R3.5.0
    查看>>
    PHP获取curl传输进度
    查看>>
    PHP获取IP所在地区(转)
    查看>>
    PHP获取IP的方法对比
    查看>>
    php获取json里面内容
    查看>>
    PHP获取图片宽度高度、大小尺寸、图片类型、用于布局的img属性
    查看>>
    PHP获取当前时间、时间戳的各种格式写法汇总
    查看>>
    php解析ipa包,获取logo
    查看>>
    php设计模式 萨莱 pdf,PHP设计模式 建造者模式
    查看>>
    php设计模式之装饰器模式
    查看>>
    R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)
    查看>>
    PHP设计模式:观察者模式
    查看>>