11.13日闲话
推歌
《红昭愿》
手中雕刻生花
刀锋千转蜿蜒成画
盛名功德塔
是桥畔某处人家
春风绕过发梢红纱
刺绣赠他
眉目刚烈拟作妆嫁
轰烈流沙枕上白发
杯中酒比划
年少风雅鲜衣怒马
也不过一刹那
难免疏漏儿时檐下
莫测变化
隔却山海
转身从容煎茶
一生长
重寄一段过往
将希冀都流放
可曾添些荒唐
才记得你的模样
一身霜
谁提笔只两行
换一隅你安康
便销得这沧桑
你还在我的心上
手中雕刻生花
刀锋千转蜿蜒成画
盛名功德塔
是桥畔某处人家
春风绕过发梢红纱
刺绣赠他
眉目刚烈拟作妆嫁
轰烈流沙枕上白发
杯中酒比划
年少风雅鲜衣怒马
也不过一刹那
难免疏漏儿时檐下
莫测变化
隔却山海
转身从容煎茶
一生长
重寄一段过往
将希冀都流放
可曾添些荒唐
才记得你的模样
一身霜
谁提笔只两行
换一隅你安康
便销得这沧桑
你还在我的心上
一生长
重寄一段过往
将希冀都流放
可曾添些荒唐
才记得你的模样
一身霜
谁提笔只两行
换一隅你安康
便销得这沧桑
你还在我的心上
乱搞bitset
常见的成员函数什么的去看oi-wiki吧,这里直说两个一般没人用的。
- _Find_first():返回第一个为\(true\)的位置,若没有返回size()
- _Find_next():返回下一个为\(true\)的位置,若没有返回size()
莫队+bitset
详见我的题解。
bitset乱搞字符串匹配
就是统计模式串\(t\)在文本串\(s\)中出现的位置。
具体做法就是,对于每一个字符开一个\(|s|\)的bitset\(B_c\),用于记录\(c\)在\(s\)中出现的位置。
初始化一个\(|s|\)的bitset M,表示所有为\(1\)的位置表示可能为结束位置。
遍历\(t\)的每一个字符\(t_i\),将\(B_c\)左移\(|t|-i\)位,然后与\(M\)按位与即可。
最后所有的为\(1\)的点就是结束位置。
套上面的板子即可,时间复杂度\(O(\frac{n^2}{w})\)。
点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t; i += p)
#define drep(i,s,t,p) for(int i = s;i >= t; i -= p)
#ifdef LOCAL
FILE *InFile = freopen("in.in","r",stdin),*OutFile = freopen("out.out","w",stdout);
#else
FILE *InFile = stdin,*OutFile = stdout;
#endif
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;
const int N = 1e5 + 1;
char s[N],t[N];int q,n;
bitset<N> pd[27],ans;
inline int get(char x){return x-'a'+1;}
inline void solve(){
cin>>(s+1);n = strlen(s+1);
rep(i,1,n,1) pd[get(s[i])].set(i);
cin>>q;
rep(i,1,q,1){
int op;cin>>op;
if(op ^ 2){
int pos;char x;cin>>pos>>x;
pd[get(s[pos])].reset(pos);
s[pos] = x;
pd[get(s[pos])].set(pos);
}
else{
int l,r;cin>>l>>r>>(t+1);ans.set();
n = strlen(t+1);
rep(i,1,n,1) ans &= pd[get(t[i])]<<(n-i);
// cerr<<ans._Find_first()<<'\n';
cout<<max((int)((ans>>(l+n-1)).count()-(ans>>(r+1)).count()),0)<<'\n';
}
}
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
solve();
}
p
本文来自博客园,作者:CuFeO4,转载请注明原文链接:https://www.cnblogs.com/hzoi-Cu/p/18544857