首页 > 其他分享 >Acwing 5220

Acwing 5220

时间:2023-09-19 18:25:57浏览次数:41  
标签:cnt ok int 5220 哈希 Acwing size

Acw 5220

题意

自己看

思路

假设串N长度为\(n\),串H长度为\(m\),遍历串H,对于\([i,i+n-1]\)这一段子串,如果所含字母个数与串N所含字母个数相同,则认为匹配,问题在于 如何判断 排列重合 的问题。字符串哈希。匹配的话直接将这一段的哈希值放入set中,去重,最后set的size就是答案

代码

const int N=1e6,M = 1e6,mod = 1e9+7,inf=1e18,P=1331;
//9.19 
int n,m,k;
//字符串哈希 

ull p[N],h[N];
string s,t;
int cnt[26];
ull get(int l,int r) 
{
	return h[r]-h[l-1]*p[r-l+1];
}

void solve() 
{
	cin>>s>>t;
	n=s.size();
	m=t.size();
	s=" "+s;
	t=" "+t;
	//字符串哈希模板 
	p[0]=1;
	for(int i=1;i<=m;i++) 
	{
		p[i]=p[i-1]*P;
		h[i]=h[i-1]*P+t[i];	
	} 
	
	unordered_set<ull> hash; 
	
	for(int i=1;i<=n;i++) cnt[s[i]-'a']++;
	
	int ok=0;
	for(int i=0;i<26;i++) ok+=(!cnt[i]);
	
	for(int i=1;i<=m;i++) 
	{	
		int c=t[i]-'a';
		cnt[c]--;
		if(cnt[c]==0) ok++;
		else if(cnt[c]==-1) ok--;
		
		if(i>n) 
		{
			cnt[t[i-n]-'a']++;
			if(cnt[t[i-n]-'a']==0) ok++;
			else if(cnt[t[i-n]-'a']==1) ok--;
		}
		if(ok==26) 
		{
			hash.insert(get(i-n+1,i));
		}
	}
	cout<<hash.size()<<endl;
	
} 

标签:cnt,ok,int,5220,哈希,Acwing,size
From: https://www.cnblogs.com/LIang2003/p/17715421.html

相关文章

  • Acwing.第121场周赛
    Acwing.第121场周赛比赛链接这次怎么出的这么简单,偷懒了是吧哈哈哈A.简单计算题目链接#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){inta,b,c;cin>>a>>b>>c;intans=(c-b)/a*a+b;cout<<ans<<endl;}......
  • acwing 219 剪纸游戏
    这一道题就是显然的multi-SG题目了(只是没有明显的后继节点,只能分解节点罢了)这里无论双方怎么决策,决策图都不可能出现1x某某的网格(原因见蓝书),所以我们在程序中就不要考虑SG[1][某某]最后的不能分解的节点就是2x2,2x3,3x3(注意不要涉及1x某某哦),我们把这三个节点赋成0即可然后对每......
  • AcWing 895. 最长上升子序列
    题目给定一个长度为$N$的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数$N$。第二行包含$N$个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围$1≤N≤1000,−10^9≤数列中的数≤10^9$输入样例:73121856输出样例:4......
  • hdu1400/acwing 291 Mondriaan's Dream
    题意描述:给定一块n*m的区域,用1*2的长方形填充,长方形可以横着或竖着摆,问一共有多少种填充方案具体思路:题意没什么好说的,简单易懂,很经典的一类状态压缩问题(在棋盘中求填充方案)。观察数据,满足n,m都比较小,但是搜索的复杂度大到无法接受,考虑使用状态压缩求解此类问题......
  • AcWing 5. 多重背包问题 II
    题目有$N$种物品和一个容量是$V$的背包。第$i$种物品最多有$s_i$件,每件体积是$v_i$,价值是$w_i$。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。接下来......
  • Acwing.第 120 场周赛
    Acwing.第120场周赛比赛链接A最大GCD给定一个正整数n(n≥2),请你确定两个正整数a,b,使得1≤a<b≤n,且gcd(a,b)尽可能大。输出gcd(a,b)的最大可能值。gcd(a,b)指a,b的最大公约数。提示:可以通过给定样例观察一下n和答案之间的关系。输入格式第一行包含整数T,表示共有T......
  • C++ 算法竞赛、03 周赛篇 | AcWing 第4场周赛
    AcWing第4场周赛竞赛-AcWing3694A还是B3694.A还是B-AcWing题库简单题#include<algorithm>#include<cstring>#include<iostream>usingnamespacestd;intn;inta,b;intmain(){cin.tie(0);charc;cin>>n;for(int......
  • AcWing 898. 数字三角形
    题目给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。738810274445265输入格式第一行包含整数$n$,表......
  • AcWing 4. 多重背包问题
    题目有$N$种物品和一个容量是$V$的背包。第$i$种物品最多有$s_i$件,每件体积是$v_i$,价值是$w_i$。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。接下来......
  • C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛
    AcWing第2场周赛竞赛-AcWing3626三元一次方程AcWing3626.三元一次方程-AcWing两层循环#include<iostream>usingnamespacestd;voidfind(intn){for(intx=0;x<=1000/3;x++){for(inty=0;y<=1000/5;y++){int......