首页 > 其他分享 >几何

几何

时间:2024-09-25 16:50:20浏览次数:1  
标签:ll len ny maxn 几何 strlen dp

几何

比赛时候唐了,连状态都没想到。

记录一下 dp 的惯用优化方法。

思路

(此处串 \(x,y\) 从 \(0\) 开始,串 \(s\) 从 \(1\) 开始)

设 \(dp[i][j][k]\) 为第 \(i\) 位时,将 \(s[1,i]\) 分为,串 \(x\) 重复若干次加上串 \(x[0,j-1]\),串 \(y\) 重复若干次加上串 \(y[0,k-1]\),的可行性。

如果可以就是 \(1\),不可以就是 \(0\)。

若 \(s[i]==x[j]\),有 \(dp[i+1][(j+1)\mod len_x][k]|=dp[i][j][k]\)。

若 \(s[i]==y[k]\),有 \(dp[i+1][j][(k+1)\mod len_y]|=dp[i][j][k]\)。

这样做会超时,考虑优化。

把 \(k\) 放进状态里。

设状态 \(f[i][j]\) 同上,值为一个二进制数,若二进制数第 \(k\) 位为 \(1\),那么表示 \(dp[i][j][k]=1\)。

这样子就把第三维压进了状态里。

对于 \(s[i]==x[j]\),有 \(f[i+1][(j+1)\mod len_x]|=f[i][j]\)。

对于第二种转移,\(f[i][j]<<1\) 中为 \(1\) 的位(\(len_y\) 这一位为 \(1\),则循环位移到第 \(0\) 位)即为可以取到的 \(y[k]\)。可以设一个 \(g[x]\) 表示字符 \(x\) 在串 \(y\) 中出现位置的状压,这样就有 \(f[i+1][j]|=(f[i][j]<<1)\& g[s[i]]\)。

于是就可以愉快的 AC 了。

CODE

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int maxn=5e5+5;

int ns,nx,ny;

char s[maxn],x[maxn],y[maxn];

ll f[maxn][60],g[30];

inline ll work(ll x)
{
    ll op=(x>>(ny-1))&1;
    x^=(op<<(ny-1));
    x=(x<<1)|op;
    return x;
}
inline void clr()
{
    for(int i=0;i<=ns+1;i++) for(int j=0;j<=nx+1;j++) f[i][j]=0;
    for(int i=1;i<=26;i++) g[i]=0;
}
int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        cin>>s+1>>x>>y;
        ns=strlen(s+1),nx=strlen(x),ny=strlen(y);
        clr();
        for(int i=0;i<ny;i++) g[y[i]-'a'+1]^=1ll<<i;
        f[0][0]=1;
        for(int i=1;i<=ns;i++)
        {
            int ch=s[i]-'a'+1;
            for(int j=0;j<nx;j++)
            {
                if(s[i]==x[j])
                {
                    f[i][(j+1)%nx]|=f[i-1][j];
                }
                ll st=f[i-1][j]&g[ch];
                f[i][j]|=work(st);
            }
        }
        if(f[ns][0]&1) puts("Yes");
        else puts("No");
    }
}

标签:ll,len,ny,maxn,几何,strlen,dp
From: https://www.cnblogs.com/binbin200811/p/18431676

相关文章

  • [算法] A LITTLE 计算几何
    叉积有两个平面向量a,b,那么有a$\times$b$=x_a\timesy_b-x_b\timesy_a$;这是有方向的,且遵守右手定则,正代表a逆时针转到b,负代表顺时针;凸包求凸包,我用的$Graham$扫描法;首先把最底下的点找出来,然后按照其它点对于这个点的角度排序,然后用一个类似于单调栈的......
  • 35. 模型材质和几何体属性
    本文章给大家介绍模型对象的几何体.geometry和材质属性.material。浏览器控制台查看对象和属性浏览器控制打印模型对象mesh,可以展开对象,查看对象的几何体.geometry和材质属性.material。constmesh=newTHREE.Mesh(geometry,material);console.log('mesh',mesh);浏览......
  • 几何透视图像校正处理软件 DxO ViewPoint v4.12 中文授权版
    DxOViewPoint是DxOLabs旗下一款行业领先级几何透视图像校正处理软件。DxOViewPoint让您可以完全掌控线条、角度和形状。调整透视、修复畸变、改变特定区域形状和校正广角拉伸,以获取精美图像。DxOViewPoint可作为独立应用程序运行,也可作为DxOPhotoLab中的工具面板以及......
  • 【Java+GDAL】读取shp文件图层几何类型
    文章目录前言一、GDAL和Java版本二、代码实现1.引入gdal环境2.代码实现3.ogrConstants中的几何类型总结前言今天继续Java+GDAL,之前写的几篇处理shp的文章包括:【Java+GDAL】读取shp文件的坐标信息(坐标系+EPSG码)【Java+GDAL】shp新增属性字段与删除属性字段【Java......
  • 23. 几何体顶点位置数据和点模型
    本节课主要目的是给大家讲解几何体geometry的顶点概念,相对偏底层一些,不过掌握以后,你更容易深入理解Threejs的几何体和模型对象。缓冲类型几何体BufferGeometrythreejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry (opensnewwindow)类构建的,Bu......
  • 几何概率模型
    一、几何概率模型①样本空间的样本点为无限个②每个样本点发生的可能性是均等的③P(A)=事件A的几何度量值/样本空间的几何度量值说明:如果样本空间的样本点为有限个,则为古典概型通过2个例子,来感受下两者的区别①例:在[1,4]区间内,任意取一个整数,求该整数<2的概率设:事件A为整数<2第1......
  • WPF 已知问题 包含 NaN 的 Geometry 几何可能导致渲染层抛出 UCEERR_RENDERTHREADFAIL
    本文记录一个WPF已知问题,当传入到渲染的Geometry几何里面包含了NaN数值,将可能让应用程序收到从渲染层抛上来的UCEERR_RENDERTHREADFAILURE异常,且此异常缺乏必要信息,比较难定位到具体错误逻辑此问题是小伙伴报告给我的,详细请看https://github.com/dotnet/wpf/issues/7421......
  • 第 5 章多视图几何
    本章讲解如何处理多个视图,以及如何利用多个视图的几何关系来恢复照相机位置信息和三维结构。通过在不同视点拍摄的图像,我们可以利用特征匹配来计算出三维场景点以及照相机位置。本章会介绍一些基本的方法,展示一个三维重建的完整例子;本章最后将介绍如何由立体图像进行致密深度......
  • 【GeoEvent】实现点要素服务几何信息联合StreamServer流服务数据信息绑定
    数据情况通过sid字段挂接,35个一组数据流结构CSV​​IOT点位数据​​点位数据提前发布为FeatureServer要素服务注意关联字段类型与GeoEvent定义一致​​​​创建GeoEvent定义(数据结构)根据数据流结构决定,注意关联字段与GeoEvent定义一致​​创建TCP接收器​​......
  • 向量与矩阵几何关系
    目录一、基向量二、向量与基向量三、向量张成的空间四、矩阵与线性变换五、矩阵乘法与线性变换复合一、基向量基向量(basisvectors)是构成向量空间的一组基本元素,它们满足以下条件:线性无关:基中的向量之间不能通过线性组合相互表示。这意味着没有一个向量可以表示为......