洛谷P2697 非DP js代码

思路

将绿宝石记为1,红宝石记为-1,求前缀和sum
对于i 若sum[i] === sum[j],则i···j为一个目标串。
数据量只有1e6,所以用一个最简单的hash记录sumi的下标。在求前缀和的过程中更新下标的值,做差取max即为答案。

const fs = require('fs')
const data = fs.readFileSync('/dev/stdin')
const str = data.toString('ascii').trim()
const maxn = 1000005
// let str = 'GGRRGR'
let trans = []
Array.prototype.forEach.call(str,(cur, index) => {
    if(cur === 'G') {
        trans.push(1)
    } else {
        trans.push(-1)
    }
})
let ans = 0
let sum = []
sum.push(0)
for(let i = 0; i < trans.length; i++) {
    sum.push(sum[i] + trans[i])
}
// console.log(trans)
// console.log(sum)
let lpos = Array(maxn), rpos = Array(maxn)
sum.forEach((cur,index)=>{
    if (lpos[cur] === undefined) {
        lpos[cur] = index
    }
    rpos[cur] = index
    ans = Math.max(ans, rpos[cur] - lpos[cur])
})
console.log(ans)
process.exit()

你可能感兴趣的:(洛谷P2697 非DP js代码)