首页 > 其他分享 >字符串口胡记录

字符串口胡记录

时间:2023-08-23 15:25:16浏览次数:49  
标签:ull 记录 int len MAXN 哈希 字符串

[NOIP2020] 字符串匹配

枚举两个分界点并检查是否合法的暴力很显然,考虑优化。

字符串只会哈希可以想到用哈希优化比较复杂度,具体来说,只用枚举\(AB\)的长度\(len\),然后每次暴力往后跳用哈希检查往下\(len\)个字符并更新答案,直到它们与\(AB\)不同。

同时考虑如何统计\(f(A) \leq f(C)\)的对数,显然前缀后缀的\(f\)都可以线性预处理,用树状数组维护小于\(f(C)\)的前缀个数即可。

由调和级数可知时间复杂度\(O(n \log_2 n \log_2 26)\),需要轻微卡常。

说得有点抽象,直接看代码吧。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int T;

const int MAXN=1050000;

#define ull unsigned long long

ull mul[MAXN];
ull P=131;
struct Hash{
    ull H[MAXN];
    void init(char *s,int n){
        for (int i=1;i<=n;i++){
            H[i]=H[i-1]*P+(s[i]-'a'+1);
        }
    }
    ull hash(int l,int r){
        return H[r]-H[l-1]*mul[r-l+1];
    }
}h;

int n;
char s[MAXN];

struct Bit{
    int bit[30];
    #define lowbit(x) (x&(-x))
    void update(int p,int v){
        p++;
        for (;p<=27;p+=lowbit(p)) bit[p]+=v;
    }
    int query(int p){
        p++;
        int ret=0;
        for (;p;p-=lowbit(p)) ret+=bit[p];
        return ret;
    }
    void clear(){
        for (int i=0;i<30;i++) bit[i]=0;
    }
    #undef lowbit
}t;

int f1[MAXN],f2[MAXN],cnt[30],res;

void prework(){
    memset(cnt,0,sizeof cnt);res=0;
    for (int i=1;i<=n;i++){
        if (cnt[s[i]-'a'+1]&1) res--;
        cnt[s[i]-'a'+1]++;
        if (cnt[s[i]-'a'+1]&1) res++;
        f1[i]=res;
    }
    memset(cnt,0,sizeof cnt);res=0;
    for (int i=n;i;i--){
        if (cnt[s[i]-'a'+1]&1) res--;
        cnt[s[i]-'a'+1]++;
        if (cnt[s[i]-'a'+1]&1) res++;
        f2[i]=res;
    }
}

#define ll long long

int main(){
    mul[0]=1;
    for (int i=1;i<MAXN;i++) mul[i]=mul[i-1]*P;
    cin>>T;
    while(T--){
        scanf("%s",(s+1));n=strlen(s+1);
        h.init(s,n);
        prework();
        t.clear();
        ll ans=0;
        t.update(f1[1],1);
        for (int len=2;len<n;len++){
            int k;
            for (k=len+1;k+len-1<n;k+=len){
                if (h.hash(1,len)!=h.hash(k,k+len-1)) break;
                ans+=t.query(f2[k]);
            }
            ans+=t.query(f2[k]);
            t.update(f1[len],1);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

标签:ull,记录,int,len,MAXN,哈希,字符串
From: https://www.cnblogs.com/cqbzlzh/p/17651725.html

相关文章

  • 记录一个通过keep-alive缓存组件不生效的问题
    项目中通过菜单管理配置页面进行缓存,layout组件中通过keep-alive的include属性进行命中官方描述:匹配首先检查组件自身的name选项,如果name选项不可用,则匹配它的局部注册名称(父组件components选项的键值)。匿名组件不能被匹配。通过检查发现配置菜单时用的组件名称(动态菜......
  • 【错误记录】编译 Linux 内核报错信息及解决办法
    【错误记录】编译Linux内核报错报错信息:/bin/sh:1:bison:notfound 解决方案:sudoapt-getinstallbison***********************************************************************************************************报错信息:fatalerror:openssl/bio.h:Nosuchf......
  • shell脚本学习记录
    参考文章:https://blog.csdn.net/weixin_43288201/article/details/105643692 1.脚本必须有可执行权限chmod+xtest.sh  //给test.sh文件的所有组增加可执行权限,也可以根据数字增加可读4、可写2、可执行1如:chmod755test.sh 2.脚本的调用形式以及编写规范  2.1......
  • RuoYi-vue配置记录
    如果这个项目能顺利运行,标志着Springboot+vue的前后端环境都配好了。一、官方文档若依官方文档:介绍|RuoYi,在这个地方克隆/下载项目源代码https://gitee.com/y_project/RuoYi-Vue解压到自己的目录下 首先根据官方文档的环境部署所说,检查一下自己的这些是否都满足要求了:J......
  • .net 记录http请求
    记录http请求环境.net7一、过滤器(Filter)这个过程用的的是操作过滤器(ActionFilter)二、2.1继承IAsyncActionFilter2.2重写OnActionExecutionAsyncOnActionExecutionAsync-在调用操作方法前调用OnActionExecutionAsync(ActionExecutingContext,ActionExecutionDele......
  • Vue+SpringBoot项目分离部署踩坑记录
    昨天花了一晚上终于成功部署了个人网站,在这个过程中踩了很多坑,现在回顾总结记录一下,以免今后继续犯错误前端:Vue后端:SpringBoot数据库:Mysql一、前端1、前端项目采用Nginx进行部署,其中Nginx配置文件部分内容如下nginx.conf部分内容1server{2listen443ssl......
  • Pandas字符串操作的各种方法速度测试
    由于LLM的发展,很多的数据集都是以DF的形式发布的,所以通过Pandas操作字符串的要求变得越来越高了,所以本文将对字符串操作方法进行基准测试,看看它们是如何影响pandas的性能的。因为一旦Pandas在处理数据时超过一定限制,它们的行为就会很奇怪。我们用Faker创建了一个100,000行的测......
  • webman:全局中间件:记录访问日志(v1.5.7)
    一,官方文档地址:https://www.workerman.net/doc/webman/middleware.html二,php代码1,配置中间件:config/middleware.php12345678910111213141516171819<?php/** *Thisfileispartofwebman. * *LicensedunderTheMITLicense......
  • java字符串乱码判断
    publicstaticbooleanerrCodes(Stringstr){return!(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(str));}//扩展判断是否为中文publicstaticbooleancheckChinese(charch){returnString.valueOf(ch).match......
  • Python基础入门学习笔记 015字符串:格式化
     字符串格式化符号含义 将ASCII码97对应的字符输出 格式化整数 格式化操作符辅助命令5表示输出为五位数Python的转义字符及其含义......