【递推】 HDU 5459 Jesus Is Here

本文介绍了一种计算字符串中特定字符两两之间下标差和的方法,并提供了详细的算法推导过程及C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接

题意 :求两两之间的下标差和

 numc [ i ]  为该段 c的数量

addc [ i ] 为该段 所有c的 下标和 (从0 开始

len [ i ] 为该段 长度

ans[ i ] 为答案


addc[i]  因为i-1段前面的c每个增加的len[i-2] 的长度 

所以为 addc[ i-2 ]  +addc[ i - 1 ]  +  len[ i- 2 ]*numc[ i- 1 ] 


ans[i]  需要计算 i-2 段 中每个 c 与 i-1 段中每个c的距离和

len[i-2]*numc[ i-2 ] - addc[i-2] 表示 i-2段中每个c 距离 i-2 段末尾的距离和

再乘上个numc[ i-1 ]  再加上 addc[i-1] * numc[ i-2 ]    


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
#include <list>
#include <set>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <map>
typedef long long LL;
const int INF = 1<<29;
const LL mod = 530600414;
const int MAXN = 201314+7;
const int MAXM = 21101;
LL ans[MAXN];
LL len[MAXN],numc[MAXN],addc[MAXN];
int main()
{
    len[3]=3,len[4]=5;
    numc[3]=1,numc[4]=1;
    addc[3]=0,addc[4]=2;
    ans[3]=0,ans[4]=0;
    for(int i=5;i<MAXN;i++)
    {
        len[i]=(len[i-2]+len[i-1])%mod;
        numc[i]=(numc[i-2]+numc[i-1])%mod;
        addc[i]=(addc[i-2]+addc[i-1]+numc[i-1]*len[i-2])%mod;
        ans[i]=(ans[i-2]+ans[i-1]+(len[i-2]*numc[i-2]%mod-addc[i-2]+mod)%mod*numc[i-1]%mod + numc[i-2]*addc[i-1]%mod )%mod;
    }
    int t,n,cas=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("Case #%d: %lld\n",++cas,ans[n]);
    }
    return 0;
}
/*
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值