首页 > 其他分享 >杂项

杂项

时间:2024-10-24 20:21:12浏览次数:1  
标签:cnt include int ch now 杂项 fo

树hash


#include <cctype>
#include <chrono>
#include <cstdio>
#include <random>
#include <set>
#include <vector>

typedef unsigned long long ull;

const ull mask = std::chrono::steady_clock::now().time_since_epoch().count();

ull shift(ull x) {
  x ^= mask;
  x ^= x << 13;
  x ^= x >> 7;
  x ^= x << 17;
  x ^= mask;
  return x;
}

const int N = 1e6 + 10;

int n;
ull hash[N];
std::vector<int> edge[N];
std::set<ull> trees;

void getHash(int x, int p) {
  hash[x] = 1;
  for (int i : edge[x]) {
    if (i == p) {
      continue;
    }
    getHash(i, x);
    hash[x] += shift(hash[i]);
  }
  trees.insert(hash[x]);
}

int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  getHash(1, 0);
  printf("%lu", trees.size());
}

本质不同子序列数量

#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
int n;
const int maxn=1e6+100;
int dp[maxn];
int a[maxn]; 
int last[maxn];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        if(!last[a[i]]){
            dp[i]=dp[i-1]*2+1;
        }
        else{
            dp[i]=(dp[i-1]*2-dp[last[a[i]]-1]);
        }
        dp[i]=(dp[i]+mod)%mod;
        last[a[i]]=i;
    }
    cout<<dp[n]<<endl;
}

随机hash

#include <bits/stdc++.h>

using i64 = long long;

bool isprime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int findPrime(int n) {
    while (!isprime(n)) {
        n++;
    }
    return n;
}


int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
    
    const int P = findPrime(rng() % 900000000 + 100000000);
    
    
    
    return 0;
}



ac自动机

Ac自动机
#include<cstdio> 
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
#define eb emplace_back
using namespace std;
typedef long long ll;
const int N=2e6+5;
const ll mo=1e9+7;
int ch[N][26],now,cnt,l,n,c,size[N],id[N],f[N],g[N];
char s[N];
vector<int> e[N];
queue<int> q;
void ins(int x){
	now=0;
	fo(i,1,l) {
		c=s[i]-'a';
		if (!ch[now][c]) ch[now][c]=++cnt;
		now=ch[now][c];
	}
	id[x]=now;
}
void build(){
	int r,u,v;
	fo(i,0,25) if (ch[0][i]) q.push(ch[0][i]);
	while (!q.empty()) {
		r=q.front(); q.pop();
		fo(i,0,25) {
			u=ch[r][i];
			if (!u) {
				ch[r][i]=ch[f[r]][i];
				continue;	
			}
			v=f[r];
			while (v && !ch[v][i]) v=f[v];
			f[u]=ch[v][i];
			q.push(u);
		}
	}
}
void match() {
	now=0;
	fo(i,1,l) {
		c=s[i]-'a';
		now=ch[now][c];
		g[now]++;
	}
}
void dfs(int x){
	for (int v:e[x]) {
		dfs(v);
		g[x]+=g[v];
	}
}
int main(){
//	freopen("data.in","r",stdin);
	
	scanf("%d",&n);
	fo(i,1,n) {
		scanf("%s",s+1);
		l=strlen(s+1);
		ins(i);
	}
	build();
	
	scanf("%s",s+1);
	l=strlen(s+1);
	match();
	
	fo(i,1,cnt) e[f[i]].eb(i);
	
	dfs(0);
	fo(i,1,n) printf("%d\n", g[id[i]]);

	return 0;
}

广义矩阵乘法+ac自动机

#include<bits/stdc++.h>
#define mk(x,y) make_pair((x),(y))
#define ll long long
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
using namespace std;
ll n, m, v, now, cnt;
const ll inf = 1ll << 60;
const int N=1000;
string s;
int ch[N][26];
ll val[N],f[N];
queue<int> q;
void cmax(ll & x, ll y) {
    x = max(x, y);
}
struct mat {
    ll a[205][205];

    void init() {
        fo(i, 0, cnt) fo(j, 0, cnt) a[i][j] = 0;
    }

    void initMin() {
        fo(i, 0, cnt) fo(j, 0, cnt) a[i][j] = -inf;
    }
	
	void print() {
		fo(i,0,cnt) {
			fo(j,0,cnt) {
				cout<<a[i][j]<<" ";
			}
			cout<<"\n";
		}
	}
};
mat A,t;

mat operator * (mat& a, mat& b) {
    mat c;
    c.initMin();

    fo(i, 0, cnt) fo(j, 0, cnt) fo(k, 0, cnt) {
        cmax(c.a[i][j], a.a[i][k] + b.a[k][j]);
    }        
	return c;
}
void ins() {
    now = 0;
    int c;
    for (int i=0;i<(int)s.length();i++) {
        c = s[i] - 'a';
        if (!ch[now][c]) ch[now][c] = ++cnt;
        now = ch[now][c];
    }
    val[now] += v;
}
void build() {
    fo(i, 0, 25) if (ch[0][i]) q.push(ch[0][i]);
    
    while (!q.empty()) {
        int r = q.front(); q.pop();
        fo(i, 0, 25) {
            int u = ch[r][i];
            if (!u) {
                ch[r][i] = ch[f[r]][i]; continue;
            }

            v = f[r];
            while (v && !ch[v][i]) v = f[v];

            f[u] = ch[v][i];
            val[u] += val[f[u]];
            q.push(u);
        }
    }
}
void power(ll b) {
    while (b) {
        if (b & 1) t = t * A;
        A = A * A;
        b /= 2;
    }
}
signed main() {
	
	// freopen("data.in","r",stdin);
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> n >> m;
    fo(i, 1, m) {
        cin >> s >> v;
        ins();
    }

    build();
 
    A.initMin();
    fo(i, 0, cnt) {
        fo(j, 0, 25) {
            A.a[ch[i][j]][i] = val[ch[i][j]];
        }
    }

	
    t.init();
    fo(i, 1, cnt) t.a[i][0] = -inf;
    power(n);

    ll ans = -inf;
    fo(i, 0, cnt) ans = max(ans, t.a[i][0]);
    cout << ans;
    return 0;
}

P5787 二分图 /【模板】线段树分治

#include<bits/stdc++.h>
#define fo(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (int (i)=(b);(i)>=(a);(i)--)
#define eb emplace_back
#define lc (o<<1)
#define rc ((o<<1)|1)
#define A puts("Yes")
#define B puts("No")
using namespace std;
typedef long long ll;
typedef double db; 
const int N=5e5+5;
int f[N],s[N],n,x,y,top,m,k,f1,f2,ans[N];
struct node{
	int x,y;
};
node st[N];
vector<node> e[N*4];
int find(int x){
	if (x==f[x]) return x;
	return find(f[x]);
}
void merge(int x,int y){
	f1=find(x); f2=find(y);
	if (s[f1]<s[f2]) swap(f1,f2);
	f[f2]=f1;
	s[f1]+=s[f2];
	st[++top]=(node){f1,f2};
}
void del(int now){
	while (top>now) {
		f1=st[top].x; f2=st[top].y; top--;
		s[f1]-=s[f2];
		f[f2]=f2;
	}
}
void upd(int o,int l,int r,int x,int y,int u,int v){
	if (x>y) return;
	if (x<=l && r<=y) {
		e[o].eb((node){u,v});
		return;
	}
	int m=(l+r)>>1;
	if (x<=m) upd(lc,l,m,x,y,u,v);
	if (m<y) upd(rc,m+1,r,x,y,u,v);
}
void ask(int o,int l,int r){
	int now=top;
	bool flag=1;
	for (int i=0;i<(int)e[o].size();i++) {
		f1=find(e[o][i].x); f2=find(e[o][i].y);
		
		if (f1==f2) {
			flag=0;
			break;
		}
		
		merge(e[o][i].x, e[o][i].y+n);
		merge(e[o][i].x+n, e[o][i].y);
	}
	
	if (flag) {
		if (l==r) {
		ans[l]=1;
		}
		else {
			int m=(l+r)>>1;
			ask(lc,l,m);
			ask(rc,m+1,r);
		}
	}
	
	del(now);
}
int main(){
//	freopen("data.in","r",stdin);
	
	int l,r;
	scanf("%d %d %d",&n,&m,&k);
	fo(i,1,n*2) {
		f[i]=i; s[i]=1;
	}
	fo(i,1,m) {
		scanf("%d %d %d %d",&x,&y,&l,&r);
		upd(1,1,k,l+1,r,x,y);
	}
	
	ask(1,1,k);
	fo(i,1,k) if (ans[i]) A; else B;
	
	return 0;
}

标签:cnt,include,int,ch,now,杂项,fo
From: https://www.cnblogs.com/ganking/p/18500407

相关文章

  • CTF杂项——[LitCTF 2023]OSINT 探姬去哪了?_0
    中国电信查看属性 发现经纬度经纬度转换搜索地址  发现在浙江省嘉兴市秀洲区高德地图上搜索依次试验  发现是中国电信大厦......
  • CTF杂项——[安徽省赛 2021]misc签到
    kali分离出一个压缩包 需要密码010打开flag.png文件头是FFD8FFE0  说明是jpeg文件  但题目给的文件后缀是.png  把后缀修改成.jpg查看属性  找到密码  this_is_password得到flag......
  • 网络安全学习路线及各类杂项汇总,零基础入门到精通,收藏这篇就够了
    1.安全法(笔者认为学习网络安全前首先得学这个)不是这个↑网络安全法律:了解网络安全相关的法律法规和伦理标准。合规性与标准:学习ISO27001、GDPR等安全标准和合规要求。2.基础知识计算机网络基础:了解网络的基本原理,如TCP/IP协议、OSI模型、路由和交换等。操作系......
  • Git命令学习--杂项
    目录前言一、本地栈式提交二、提交的技巧1.提交的技巧#12.提交的技巧#2三、GitTags四、GitDescribe五、复杂情况1.多分支rebase2.选择parent提交记录3.纠缠不清的分支总结前言一些Git技术、技巧与贴士大合集......
  • 杂项之 - 康托展开
    在洛谷上闲逛时无意中看到了这个东东,顺便学了一下Part1康托展开是什么康拓展开是一种将排列映射为一个自然数的双射康托展开可以用来求一个\(1\simn\)的任意排列的排名。Part2康托展开的公式对于一个排列\(a_1\dotsa_n\)把\(1\simn\)的所有排列按字典序排序,这个......
  • .NET高级调试 - 代码审查以及杂项命令
    简介代码审查就是观察代码,代码形态分为三种C#代码>IL代码》汇编代码。通过代码审查,可以从原始代码的字节流中推测出逻辑详情高级调试本质上属于逆向分析,更多的是以汇编为主。反汇编代码u(unassemble)命令u把字节流反汇编为汇编指令还有一个变种ub,uf。u是向下反汇编,ub是向......
  • 杂项乱写 9.29
    因为没有模拟赛,所以考虑捡捡之前漏下的小点。注:LCA之后的讲解中可能会出现一些自由的文字,酌情阅读。dfs序求LCA倍增LCA的常数还是过于大了,虽然好记但会导致我们在一些数据奇异的题中比其它方式求LCA的人的得分要低。所以就有了这个用dfs序求lca的高科技,在时间效率......
  • 『杂项』Linux 常用指令
      不会吧不会吧不会还有Oier不会Linux指令要写一篇博客记一下  今年S组人数骤增,遂ctrl+cv出本篇博客以获得两分(Linux常用指令文件和目录管理命令ls:列出当前目录中的文件和子目录。pwd:显示当前工作目录的路径。cd:切换工作目录。mkdir:创建新目录。rmdi......
  • 杂项——矩阵加速(进阶)
    前言:在之前已经学习过矩阵快速幂的用法,那些只是基础。在ICPC中大多数难度较高,且并不是简单的只需要常数的矩阵或者简单的图上问题,而是结合dp方程去推导出来转移矩阵。trick:例题:链接:https://ac.nowcoder.com/acm/contest/88880/E来源:牛客网给出两个整数\(n,k\),有一个正整数......
  • CTF学习-MISC杂项解题思路
    文件操作与隐写文件类型识别 1.File命令当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型来修改后缀名即可正常打开文件。使用场景:不知道后缀名,无法打开文件。格式:filemyheart2.winhex通过winhex.程序中可以查看文件头类型,根据文件头类型判断出......