2021.11.11 EXKMP

https://www.luogu.com.cn/problem/P5410

下标以1开头:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int N=2e7+10;
typedef long long ll;
int lenp,lens,z[N],ext[N];
char t[N],s[N]; inline void getz(char *s){
int n=strlen(s+1);
memset(z,0,sizeof(z));
z[1]=n;
for(int i=2,l=0,r=0;i<=n;i++){
if(i<=r)z[i]=min(z[i-l+1],r-i+1);
while(i+z[i]<=n&&1+z[i]<=n&&s[z[i]+1]==s[(i+z[i]-1)+1])++z[i];
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
//z[0]=n;
//cout<<"z "<<endl;//
//for(int i=0;i<=n;i++)cout<<z[i]<<" ";cout<<endl;//
}
inline void exkmp(char *s,char *t){
int n=strlen(s+1),m=strlen(t+1);
getz(t);
ll ans=0;
for(int i=1;i<=m;i++)ans^=1ll*(i)*(z[i]+1);
cout<<ans<<endl;
memset(ext,0,sizeof(ext));
for(int i=1,l=0,r=0;i<=n;i++){
if(i<=r)ext[i]=min(z[i-l+1],r-i+1);
while(i+ext[i]<=n&&1+ext[i]<=m&&t[ext[i]+1]==s[(i+ext[i]-1)+1])++ext[i];
if(r<i+ext[i]-1)l=i,r=i+ext[i]-1;
}
ans=0;
for(int i=1;i<=n;i++)ans^=1ll*(i)*(ext[i]+1);
cout<<ans;
//cout<<"ext"<<endl;//
//for(int i=0;i<=n;i++)cout<<ext[i]<<" ";cout<<endl;//
} int main(){
scanf("%s",s+1);scanf("%s",t+1);
exkmp(s,t);
return 0;
}

下标以0开始:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int N=2e7+10;
typedef long long ll;
int lenp,lens,z[N],ext[N];
char t[N],s[N]; inline void getz(char *s){
int len=strlen(s);
memset(z,0,sizeof(z));
z[0]=len;
for(int i=1,l=0,r=0;i<len;i++){
if(i<=r)z[i]=min(z[(i-l+1)-1],r-i+1);
while(i+z[i]<len&&s[z[i]]==s[(i+z[i]-1)+1])++z[i];
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
ll ans=0;
for(int i=0;i<len;i++)ans^=1ll*(i+1)*(z[i]+1);
cout<<ans<<endl;
}
inline void exkmp(char *s,char *t){
getz(t);
int lens=strlen(s),lent=strlen(t);
for(int i=0,l=-1,r=-1;i<lens;i++){
if(i<=r)ext[i]=min(z[(i-l+1)-1],r-i+1);
while(i+ext[i]<lens&&ext[i]<lent&&t[ext[i]]==s[(i+ext[i]-1)+1])++ext[i];
if(i+ext[i]-1>r)l=i,r=i+ext[i]-1;
}
ll ans=0;
for(int i=0;i<lens;i++)ans^=1ll*(i+1)*(ext[i]+1);
cout<<ans<<endl;
} int main(){
scanf("%s",s);scanf("%s",t);
exkmp(s,t);
return 0;
}

练习题

https://www.luogu.com.cn/problem/CF432D

论树状数组的好用 ~

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int N=1e5+10;
int z[N],ext[N],t[N],top;
char s[N*2];
struct node{
int len,tot;
bool operator <(const node &b)const{
return len<b.len;
}
}ans[N]; inline void getz(char *s){
int n=strlen(s+1);
z[1]=n;
for(int i=2,l=0,r=0;i<=n;i++){
if(i<=r)z[i]=min(z[i-l+1],r-i+1);
while(i+z[i]<=n&&s[z[i]+1]==s[(i+z[i]-1)+1])++z[i];
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
}
inline void exkmp(char *s,char *t){
int lens=strlen(s+1),lent=strlen(t+1);
getz(t);
for(int i=1,l=-1,r=-1;i<=lens;i++){
if(i<=r)ext[i]=min(z[i-l+1],r-i+1);
while(i+ext[i]<=lens&&1+ext[i]<=lent&&t[ext[i]+1]==s[(i+ext[i]-1)+1])++ext[i];
if(i+ext[i]-1>r)l=i,r=i+ext[i]-1;
}
}
inline int lowbit(int x){
return x&-x;
}
inline void add(int x,int k,int len){
for(int i=x;i<=len;i+=lowbit(i))t[i]+=k;
}
inline int query(int x){
int fin=0;
for(int i=x;i>0;i-=lowbit(i))fin+=t[i];
return fin;
} int main(){
scanf("%s",s+1);
int len=strlen(s+1);
//cout<<len<<endl;
s[len+1]='|';
for(int i=1;i<=len;i++)s[i+len+1]=s[i];
//for(int i=1;i<=len*2+2;i++)printf("%c",s[i]);cout<<endl;
int leni=strlen(s+1);
//cout<<leni<<endl;
getz(s);
//for(int i=1;i<=leni;i++)cout<<z[i]<<" ";cout<<endl;
for(int i=len+2;i<=leni;i++)if(z[i])add(z[i],1,len);
for(int i=len+2;i<=leni;i++)if(i+z[i]-1==leni){
++top;
ans[top].len=z[i];ans[top].tot=query(len)-query(z[i]-1);
}
sort(ans+1,ans+top+1);
cout<<top<<endl;
for(int i=1;i<=top;i++)cout<<ans[i].len<<" "<<ans[i].tot<<endl;
return 0;
}

https://www.luogu.com.cn/problem/P7114

https://www.luogu.com.cn/blog/nitubenben/solution-p7114

PS:树状数组是EXKMP的好帮手~

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int N=(1<<20)+10;
typedef long long ll;
int t,z[N],before[N],after[N],tree[N];
char s[N]; inline void getz(char *s){
int n=strlen(s);
z[0]=n;
for(int i=1,l=0,r=0;i<n;i++){
if(i<=r)z[i]=min(z[(i-l+1)-1],r-i+1);
while(i+z[i]<n&&s[z[i]]==s[(i+z[i]-1)+1])++z[i];
if(i+z[i]-1>r)l=i,r=i+z[i]-1;
}
}
inline int lowbit(int x){
return x&-x;
}
inline void add(int x,int k,int n){
for(int i=x;i<=n;i+=lowbit(i))tree[i]+=k;
}
inline int query(int x){
int fin=0;
for(int i=x;i>0;i-=lowbit(i))fin+=tree[i];
return fin;
} int main(){
cin>>t;
while(t--){
memset(z,0,sizeof(z));
memset(after,0,sizeof(after));
memset(before,0,sizeof(before));
memset(tree,0,sizeof(tree));
scanf("%s",s);
getz(s);
int n=strlen(s);
for(int i=0;i<n;i++)if((i+z[i]-1)+1==n)--z[i];
for(int i=0;i<n;i++)++after[s[i]-'a'];
int all=0,pre=0,suf=0;
ll ans=0;
for(int i=0;i<26;i++)if(after[i]&1)++all;
suf=all;
for(int i=0;i<n;i++){
int x=s[i]-'a';
if(after[x]&1)--suf;
else ++suf;
--after[x];
if(before[x]&1)--pre;
else ++pre;
++before[x];
if(i&&i!=n-1){
int num=z[i+1]/(i+1)+1;
ans+=1ll*(num/2)*query(all+1)+1ll*(num-num/2)*query(suf+1);
}
add(pre+1,1,n);
}
cout<<ans<<endl;
}
return 0;
}

2021.11.11 EXKMP的更多相关文章

  1. 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)

    2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...

  2. NOIp 11.11/12

    最后一场比较正式的NOIp模拟赛,写一发小总结.题目没什么好说的,大部分很简单,先贴一下代码. 1111 T1 //string //by Cydiater //2016.11.11 #include ...

  3. 11.11光棍节工作心得——github/MVP

    11.11光棍节工作心得 1.根据scrum meeting thirdday中前辈的指导进行学习 我在博客中贴了链接,竟然TrackBack引来了原博主,

  4. 下面程序的输出结果是____ A:11,10 B:11,11 C:10,10 D:10,11 int x=10; int y=x++; printf("%d,%d",(x++,y),y++);

    下面程序的输出结果是____ A:11,10 B:11,11 C:10,10 D:10,11 int x=10; int y=x++; printf("%d,%d",(x++,y) ...

  5. Hadoop格式化 From hu-hadoop1/192.168.11.11 to hu-hadoop2:8485 failed on connection exception: java.net.

    192.168.11.12:8485: Call From hu-hadoop1/192.168.11.11 to hu-hadoop2:8485 failed on connection excep ...

  6. 〖Linux〗iptables端口转发(11.11.136.80:5552 <==> 10.10.136.1:8055/11.11.136.1:8055)

    环境: pc1: 10.10.72.1 (network: 10.10.72.0/22) pc2: 地址1: 10.10.136.1 (nework: 10.10.136.0/22) 地址2: 11. ...

  7. 2017.11.11 B201 练习题思路及解题方法

    2017.11.11 B201 练习题思路及解题方法 题目类型及涵盖知识点 本次总共有6道题目,都属于MISC分类的题目,涵盖的知识点有 信息隐藏 暴力破解 音轨,摩斯电码 gif修改,base64原 ...

  8. Notes of Daily Scrum Meeting(11.11)

    Notes of Daily Scrum Meeting(11.11) 今天是11月11号光棍节,不知道大家的购物热情被点燃没有,有没有买到自己心仪的东西.额,今天我们的团队任务进度和昨天差不多, 每 ...

  9. TeamWork#3,Week5,Scrum Meeting 11.6, 11.7, 11.11, 11.12

    11.6:到目前为止基本已完成相关知识的学习,各方面工作都开始进行,一开始进行比较慢. 11.7:项目遇到困难,需要补充相关知识,进度慢了下来. 11.11:各方面工作进展比较顺利,没有什么大问题. ...

随机推荐

  1. Linux下使用Google Authenticator配置SSH登录动态验证码

    1.一般ssh登录服务器,只需要输入账号和密码.2.本教程的目的:在账号和密码之间再增加一个验证码,只有输入正确的验证码之后,再输入密码才能登录.这样就增强了ssh登录的安全性.3.账号.验证码.密码 ...

  2. 『现学现忘』Docker基础 — 34、DockerFile文件详解

    目录 1.DockerFile文件说明 2.Dockerfile构建过程解析 (1)Docker容器构建三步骤 (2)Dockerfile文件的基本结构 (3)Dockerfile注意事项 (4)Do ...

  3. 什么是 Spring Cloud?

    Spring cloud 流应用程序启动器是 于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成.Spring cloud Task,一个生命周期短暂的微服务框架,用于快 ...

  4. Vue部署到云服务器时,访问Nginx代理出现We're sorry but books doesn't work properly without JavaScript enabled. Please enable it to continue.

    出现这个的原因,我这边的是Nginx的问题,因为没有匹配到静态文件的原因 第一个location是始终将访问的url请求定向到 index.html这个主页面 第二个location块是将index. ...

  5. Mybatis使用拦截器自定义审计处理

    void test_save_1(@Param("relatedBookCategoryEntity") RelatedBookCategoryEntity relatedBook ...

  6. 为什么要使用 rabbitmq?

    1.在分布式系统下具备异步,削峰,负载均衡等一系列高级功能; 2.拥有持久化的机制,进程消息,队列中的信息也可以保存下来. 3.实现消费者和生产者之间的解耦. 4.对于高并发场景下,利用消息队列可以使 ...

  7. centos 7环境下安装部署zookeeper

    近一直在看zookeeper的知识,有所收获,打算写些一些关于zookeeper的博客,也当做是自己的复习和笔记. 在上一篇 博客中简单地介绍了centos 7 下如何安装jdk,这一篇将介绍如何在c ...

  8. 学习GlusterFS(五)

    一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...

  9. 更改IE中的jdk版本

    一丶打开IE设置: 快捷键:Ctrl+Shift+Alt+S 二丶在设置中调设已经安装的jdk版本(前提已安装):

  10. python学习笔记(二)——程序结构

    1. 选择结构: if 语句:单分支.双分支.多分支 **单分支结构** if 条件表达式: 语句块 **双分支结构** if 条件表达式: 语句块 else: 语句块 **多分支结构** if 条件 ...