FJUT 14届校赛 J题 hash判子串

本文介绍了一种使用Hash算法优化字符串匹配的问题解决方法,通过预处理和存储目标字符串的Hash值,实现快速查找子串,特别关注在允许有限错误匹配的情况下的应用。

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

http://www.fjutacm.com/Contest.jsp?cid=705#P9
题意: 两 个 字 符 串 S , 都 是 01 串 ) , 问 能 否 在 至 多 改 变 T 的 一 个 字 符 的 情 况 下 , 使 得 T 是 S 的 子 串 ( 连 续 的 ) 两个字符串S,都是01串), 问能否在至多改变T的一个字符的情况下,使得T是S的子串(连续的) S01T使TS

题解:hash。
对 S , T 打 两 个 h a s h 表 , h a s h 预 处 理 出 S 中 , 长 度 为 l e n ( T ) 的 所 有 子 串 的 h a s h 值 , 存 入 m a p 中 对S,T打两个hash表, hash预处理出S中,长度为len(T)的所有子串的hash值,存入map中 SThashhashSlen(T)hashmap
O ( l e n T ) 分 别 修 改 每 一 个 位 置 的 字 符 , 然 后 O ( 1 ) 求 h a s h 值 , 判 断 m a p 中 是 否 存 在 , 注 意 细 节 就 好 了 O(lenT)分别修改每一个位置的字符,然后O(1)求hash值,判断map中是否存在,注意细节就好了 O(lenT)O(1)hashmap

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector> 
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x)  x&-x;  
#define debugint(name,x) printf("%s: %d\n",name,x);
#define debugstring(name,x) printf("%s: %s\n",name,x);
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-6;
const int maxn = 1e5+5;
const int mod = 1e9+7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
char s[maxn],t[maxn];
ull sum[maxn];
map<ull,int>mp;
ull base = 131;
ull h1[maxn],h2[maxn],fac[maxn];
ull geth1(int l,int r){

    if(l == 0) return h1[r];
    return (h1[r]-h1[l-1]*fac[r-l+1]);
}
ull geth2(int l,int r){
    if(l == 0) return h2[r];
    return (h2[r]-h2[l-1]*fac[r-l+1]);
}
int main() {
    int T;
    cin>>T;
    fac[0] = 1;
    for(int i = 1; i < maxn; i++)
        fac[i] = fac[i-1]*base;
    while(T--){
        mp.clear();
        scanf("%s%s",s,t);
        int lens = strlen(s);
        int lent = strlen(t);
        h1[0] = s[0];
        for(int i = 1; i < lens; i++) 
            h1[i] = h1[i-1]*base + s[i];
        h2[0] = t[0];
        for(int i = 1; i < lent; i++) 
            h2[i] = h2[i-1]*base + t[i];
        ull tmp;
        for(int i = 0; i < lens-lent+1; i++){
            tmp = geth1(i,i+lent-1);
            mp[tmp]++;
        }
        if(mp[h2[lent-1]]){
        	puts("YES");
        	continue;
		} 
        ull res;
        int ok = 0;
        for(int i = 0; i < lent; i++){
            if(t[i] == '0') res = h2[i-1]*base+'1';
            else res = h2[i-1]*base+'0';
            res = res*fac[lent-1-i]+geth2(i+1,lent-1);
            //cout<<res<<endl;
            if(mp[res]){
                ok = 1;
                break;
            }
        }
        if(ok) puts("YES");
        else puts("NO");
    }
}
Windows 系统修复工具主要用于解决 Windows 11/10 系统中的各种常见问,具有操作简单、功能全面等特点: 文件资源管理器修复:可解决文件资源管理器卡死、崩溃、无响应等问,能终止崩溃循环。还可修复右键菜单无响应或选项缺失问,以及重建缩略图缓存,让图片、视频等文件的缩略图正常显示,此外,还能处理桌面缺少回收站图标、回收站损坏等问。 互联网和连接修复:能够刷新 DNS 缓存,加速网页加载速度,减少访问延迟。可重置 TCP/IP 协议栈,增强网络连接稳定性,减少网络掉线情况,还能还原 Hosts 文件,清除恶意程序对网络设置的篡改,保障网络安全,解决电脑重装系统后网络无法连接、浏览器主页被篡改等问。 系统修复:集成系统文件检查器(SFC),可自动扫描并修复受损的系统文件。能解决 Windows 激活状态异常的问,还可重建 DLL 注册库,恢复应用程序兼容性,解决部分软件无法正常运行的问,同时也能处理如 Windows 沙箱无法启动、Windows 将 JPG 或 JPEG 保存为 JFIF 等系统问。 系统工具维护:提供启动管理器、服务管理器和进程管理器等工具,用户可控制和管理启动程序、系统服务和当前运行的进程,提高系统的启动和运行速度,防止不必要的程序和服务占用系统资源。还能查看系统规格,如处理器线程数、最大显示分辨率等。 故障排除:集成超过 20 个微软官方诊断工具,可对系统问进行专业排查,还能生成硬件健康状态报告。能解决搜索和索引故障、邮件和日历应用程序崩溃、设置应用程序无法启动等问,也可处理打印机、网络适配器、Windows 更新等相关故障。 其他修复功能:可以重置组策略设置、catroot2 文件夹、记事本等多种系统设置和组件,如重置 Windows 应用商店缓存、Windows 防火墙设置等。还能添加重建图标缓存支持,恢复粘滞便笺删除
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 今天给大家分享一个关于C#自定义字符串替换方法的实例,希望能对大家有所帮助。具体介绍如下: 之前我遇到了一个算法目要求将一个字符串中的某些片段替换为指定的新字符串片段。例如,对于源字符串“abcdeabcdfbcdefg”,需要将其中的“cde”替换为“12345”,最终得到的结果字符串是“ab12345abcdfb12345fg”,即从“abcdeabcdfbcdefg”变为“ab12345abcdfb12345fg”。 经过分析,我发现不能直接使用C#自带的string.Replace方法来实现这个功能。于是,我决定自定义一个方法来完成这个任务。这个方法的参数包括:原始字符串originalString、需要被替换的字符串片段strToBeReplaced以及用于替换的新字符串片段newString。 在实现过程中,我首先遍历原始字符串,查找需要被替换的字符串片段strToBeReplaced出现的位置。找到后,就将其替换为新字符串片段newString。需要注意的是,在替换过程中,要确保替换操作不会影响后续的查找和替换,避免遗漏或重复替换的情况发生。 以下是实现代码的大概逻辑: 初始化一个空的字符串result,用于存储最终替换后的结果。 使用IndexOf方法在原始字符串中查找strToBeReplaced的位置。 如果找到了,就将originalString中从开头到strToBeReplaced出现位置之前的部分,以及newString拼接到result中,然后将originalString的查找范围更新为strToBeReplaced之后的部分。 如果没有找到,就直接将剩余的originalString拼接到result中。 重复上述步骤,直到originalStr
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在开发 Vue 项目时,移动端适配是一个常见挑战。为了适应不同设备的屏幕尺寸,开发者通常需要采用响应式布局策略。lib-flexible 是一个专门为移动端适配设计的 JavaScript 库,基于 Flexbox 布局模型,帮助开发者快速实现响应式布局。本文将介绍如何在 Vue 项目中引入 lib-flexible 和 px2rem-loader,以简化适配流程并提高开发效率。 安装:在项目根目录下运行以下命令安装 lib-flexible: 这会将 lib-flexible 添加到 package.json 文件的依赖项中。 配置:在 Vue 项目的入口 JS 文件(通常是 main.js 或 app.js)中导入 lib-flexible: 引入后,lib-flexible 会自动在 HTML 文档的 <head> 中添加一个 <meta name="viewport"> 标签,并将 html 元素的 font-size 设置为屏幕宽度的 1/10。例如,若设计稿宽度为 750px,则 1rem = 75px。若设计稿中某个元素宽度为 150px,则在 CSS 中应设置为 2rem: 注意: 若 HTML 文件头已存在 <meta name="viewport"> 标签,请将其注释掉,因为 lib-flexible 会用自己的 meta 标签实现适配。 为避免页面超出屏幕范围,建议设置页面最大宽度为 10rem。 手动将 px 转换为 rem 既低效又容易出错。px2rem-loader 是一个 Webpack 插件,可以自动将 CSS 中的 px 单位转换为 rem。 安装:运行以下命令安装 px2rem-loader: -save-dev 表示将其作为开发依赖项安装。 配置:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值