Manacher:最长回文

本文介绍了一种计算给定字符串中包含的最长回文串长度的方法,涉及字符串处理和算法应用。
最长回文 Time Limit:2000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

Description

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
 

Input

输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
 

Output

每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
 

Sample Input

    
aaaa abab
 

Sample Output

  
4 3
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define N 110005
char str[N];
char strf[2 * N];
int rad[2 * N];
int len;

void init(){
    int i, j;
    len = strlen(str);
    strf[0] = '@';
    strf[1] = '#';
    for(i = 0; i < len; i ++){
        strf[i * 2 + 2] = str[i];
        strf[i * 2 + 3] = '#';
    }
    strf[len * 2 + 2] = '$';
    len = len * 2 + 3;
}

int main(){
    while(~scanf("%s", str)){
        init();
        //cout << strf << endl;
        memset(rad, 0, sizeof(rad));
        int mx = 0, id;
        int len = strlen(strf);
        for(int i = 1; i < len - 1; i++){
            if(mx > i)
                rad[i] = min(rad[2 * id - i], rad[id] + id - i);
            else
                rad[i] = 1;
            while(strf[i + rad[i]] == strf[i - rad[i]])
                rad[i]++;
            if(rad[i] + i > mx){
                mx = rad[i] + i;
                id = i;
            }
        }
        int ans = 0;
        for(int i = 0; i < len; i ++){
            //printf("%d\n", rad[i]);
            if(rad[i] > ans)
                ans = rad[i];
        }
        printf("%d\n", ans - 1);
    }
    return 0;
}

manacher部分还可以写成如下形式,个人认为更容易理解(参考点击打开链接),不过注意到最后ans不用再减一

        for(int i = 1, j = 0, k; i < len;){
            while(strf[i - j - 1] == strf[i + j + 1])
                j ++;
            rad[i] = j;
            for(k = 1; k <= j && rad[i - k] != rad[i] - k; k ++){
                rad[i + k] = min(rad[i - k], rad[i] - k);
            }
            i += k;
            j = max(j - k, 0);
        }



### 关于DQN中的映射概念 #### 映射的本质 在深度Q网络(DQN)中,“一切映射”的理念指的是整个学习过程可以被理解为构建一种从状态空间到动作价值空间的映射关系。具体来说,给定当前的状态 \( s \),该映射能够预测采取不同动作 \( a \) 后所能获得的最大预期回报,即所谓的Q值[^3]。 这种映射是由深层神经网络实现的,其中输入层接收来自环境的状态信息作为输入,经过多个隐藏层处理后,在输出层给出对应各个可能的动作的价值估计。因此,DQN实际上是在尝试找到一个合适的参数化函数\( Q(s,a;θ) \),使得这个函数能尽可能准确地逼近真实的最优Q函数\[ Q*(s, a)\][^2]。 #### 数学表达形式 对于任意一对状态-行为组合\((s_t ,a_t )\) ,理想情况下希望得到如下所示的理想映射: \[ y_i = r_{t}+\gamma max_a Q(s_{t+1},a;\theta^-)[^4]\] 这里, - \(y_i\)表示目标Q值; - \(r_t\)代表即时奖励; - γ (gamma) 是折扣因子; - \(max_a Q(s_{t+1},a;\theta^-)\) 则是从下一个时刻的状态出发可以获得的最佳长期收益评估; 为了训练这样的映射器,采用经验回放机制收集大量样本对,并利用均方误差损失函数最小化真实标签预测之间的差距: \[ L(θ)=E[(y_i-Q(s,a;θ))^2 ]\] #### 实际应用案例 以交通控制系统为例,假设存在若干交叉路口处等待通行车辆形成的队列长度变化情况构成的状态向量\( S=[L_1,L_2,...,L_n ] \),以及红绿灯切换方案组成的离散型动作集合{G,R,Y} 。那么通过不断调整权重矩阵W来优化上述提到的目标函数,则最终可得一稳定可靠的映射模型,从而指导信号灯合理配置时间间隔,提高道路利用率和行车效率. ```python import numpy as np from keras.models import Sequential from keras.layers import Dense def build_model(input_shape, num_actions): model = Sequential() model.add(Dense(64, input_dim=input_shape, activation='relu')) model.add(Dense(64, activation='relu')) model.add(Dense(num_actions)) return model ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值