1.28
洛天依:脑机接口 RE 了是不是就直接死了啊
上次听到这么典的话还是在上次
HuTaoImpact:坏了,我是谁来着(深思)
哲学者的深思
HuTaoImpact:从本质上思考,我是一团物质,以普遍理论而言,我是五星公民,我是古希腊掌管记忆的神,可以自由控制每个人的思想让他们忘掉或想起我,但是我需要时间之神的帮助以及语言之神。
Hangry:想我了吗?
Shadow:想我了吗?
Xrlong:想我了吗?
wkh2008:想我了吗?
洛天依:想我了吗?
HS_xh:想我了吗?
鉴定为:HZOI2024最\(\color{white}{想我了吗}\)的一批人
lty:机房不让带零食没说不让吃零食啊
Shadow:机房不让带零食可以带原石吗
HS_xh:唉,Hangry 呢,Hangry 怎么死了?
Hangry 在我背后:你说什么?
HS_xh:
wkh2008:头可断,工是不能上的!
HuTaoImpact:落榜美术生老家是波兰的。
HS_xh:希特勒收复失地!
Shadow:我给你发个人让他帮你注册SPOJ
HS_xh:好哇!
(过了一会)HS_xh:你发了吗?
Shadow:我发了啊,(看一眼)哦我发错了。
今天都写了点什么
KMP算法
匹配
int j;
j=0;
for(int i=1;i<=la;++i)
{
while(j && b[j+1]!=a[i]) j=next[j];
if(b[j+1]==a[j]) j++;
if(j==lb)
{
cout<<i-lb+1<<'\n';
j=next[j];
}
}
处理 next 数组
j=0;
for(int i=2;i<=lb;++i)
{
while(j && b[i]!=b[j+1])
j=next[j];
if(b[j+1]==b[j]) j++;
next[i]=j;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+50;
int la,lb,next_[N],j;
char a[N],b[N];
signed main()
{
cin>>a+1;
cin>>b+1;
la=strlen(a+1);
lb=strlen(b+1);
for(int i=2;i<=lb;++i)
{
while(j && b[i]!=b[j+1])
j=next_[j];
if(b[j+1]==b[i]) j++;
next_[i]=j;
}
j=0;
for(int i=1;i<=la;++i)
{
while(j>0 && b[j+1]!=a[i]) j=next_[j];
if(b[j+1]==a[i]) j++;
if(j==lb)
{
cout<<i-lb+1<<'\n';
j=next_[j];
}
}
for(int i=1;i<=lb;++i)
cout<<next_[i]<<" ";
}
有趣的题
预处理串的长度然后 num 数组按题意模拟即可(不是
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+50;
const int p=1e9+7;
int la,lb,next_[N],n;
int sum[N];
char a[N];
signed main()
{
cin>>n;
while(n--)
{
memset(next_,0,sizeof(next_));
memset(sum,0,sizeof(sum));
cin>>a+1;
la=strlen(a+1);
int ans=1;
sum[1]=1,next_[1]=0;
for(int i=2,j=0;i<=la;++i)
{
while(j && a[i]!=a[j+1])
j=next_[j];
if(a[j+1]==a[i]) j++;
next_[i]=j;
sum[i]=sum[j]+1;
}
for(int i=1,j=0;i<=la;++i)
{
while(j>0 && a[j+1]!=a[i]) j=next_[j];
if(a[j+1]==a[i]) j++;
while(j>i/2) j=next_[j];
ans=(ans*(sum[j]+1))%p;
}
cout<<ans<<'\n';
}
}
KMP删除操作,栈模拟,如果匹配到了子串就出栈即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+50;
const int p=1e9+7;
int la,lb,next_[N],n;
int pos[N],top,sta[N];
char a[N],b[N];
signed main()
{
cin>>a+1>>b+1;
int la=strlen(a+1),lb=strlen(b+1);
for(int i=2,j=0;i<=lb;++i)
{
while(j && b[i]!=b[j+1])
j=next_[j];
if(b[j+1]==b[i]) j++;
next_[i]=j;
}
for(int i=1,j=0;i<=la;++i)
{
while(j && a[i]!=b[j+1]) j=next_[j];
if(b[j+1]==a[i]) j++;
pos[i]=j;
sta[++top]=i;
if(j==lb) top-=lb,j=pos[sta[top]];
}
for(int i=1;i<=top;++i)
cout<<a[sta[i]];
}
写的最久的题,挑了一下午发现线段树写假了😅😅😅
线段树上哈希(?),看着题解过了,大概算是懂了吧。
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define int unsigned long long
#define mid ((l+r)>>1)
#define ls (p<<1)
#define rs (p<<1|1)
namespace IO
{
inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
inline void Fire(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
inline void write(int x){char F[200];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}if(cnt==0)putchar('0');while(cnt>0)putchar(F[--cnt]);putchar(' ');}
}
using namespace std;
using namespace __gnu_pbds;
using namespace IO;
const int N=1e6;
const int base=2e6+3;
int n,m,T,ans,root,fa[N],cur,len,t[N<<2],pri=229,a[N],sx[N],Pow[N];
vector<int> num[N];
cc_hash_table<int,int> q;
int op,x,l,r;
inline void dfs(int x,int fa)
{
q[sx[x]]=x;
for(int i=0,y;i<num[x].size();++i)
if((y=num[x][i])!=fa)
sx[y]=sx[x]*base+i+1+pri,dfs(y,x);
}
inline void pushup(int p,int len)
{
t[p]=t[ls]*Pow[len]+t[rs];
}
void build(int p,int l,int r)
{
if(l==r)
{
t[p]=a[l]+pri;return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p,r-mid);
}
inline void Update(int p,int l,int r,int k,int d)
{
if(l==r)
{
t[p]=d+pri;
return;
}
k<=mid ? Update(ls,l,mid,k,d) : Update(rs,mid+1,r,k,d);
pushup(p,r-mid);
}
inline int ask(int p,int l,int r)
{
if(l==r) return l;
int x=cur*Pow[mid-l+1]+t[ls];
if(q.find(x)==q.end()) return ask(ls,l,mid);
cur=x;
return ask(rs,mid+1,r);
}
inline int Find(int p,int L,int R,int l,int r,int &o)
{
if(L<=l && r<=R)
{
int x=cur*Pow[r-l+1]+t[p];
if(q.find(x)==q.end())
{
o=1;
return ask(p,l,r);
}
cur=x;
return 0;
}
if(L>mid) return Find(rs,L,R,mid+1,r,o);
if(R<=mid) return Find(ls,L,R,l,mid,o);
int ans=Find(ls,L,R,l,mid,o);
return o ? ans : Find(rs,L,R,mid+1,r,o);
}
signed main()
{
n=read();m=read();T=read();
Pow[0]=1;
for(int i=1;i<N;++i)
Pow[i]=Pow[i-1]*base;
for(int i=1;i<=n;++i)
{
fa[i]=read();
if(!fa[i]) root=i;
else num[fa[i]].push_back(i);
}
for(int i=1;i<=m;++i)
a[i]=read();
for(int i=1;i<=n;++i)
sort(num[i].begin(),num[i].end());
dfs(root,0);
build(1,1,m);
while(T--)
{
op=read();
if(op==2)
{
l=read();x=read();Update(1,1,m,l,x);
}
else
{
x=read();l=read();r=read();
cur=sx[x];
int fl=0;Find(1,l,r,1,m,fl);
cout<<q[cur]<<'\n';
}
}
}
尝试让闲话更加充实。
所以这里有张图
所以这里还有原神大礼包
去写 企鹅 了,先发出来罢
Upd:
乐了,机房一些人太颓了导致又把洛谷封了,导致我做题纪要又死了。
乐,Huge 疯狂 D HuTaoImpact