IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 哈夫曼编码和字典树 -> 正文阅读

[PHP知识库]哈夫曼编码和字典树

哈夫曼

在这里插入图片描述

HUD2527

http://acm.hdu.edu.cn/showproblem.php?pid=2527

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
priority_queue <int,vector <int>,greater <int> > q;
int main() {
	int t;
	cin>>t;
	while(t--) {
		int n;
		char ch[100005];
		cin>>n>>ch;
		int tem[26];
		for(int i=0; i<26; i++)tem[i]=0;
		for(int i=0; i<strlen(ch); i++) {
			tem[ch[i]-'a']++;
		}
		int len=0,sum=0;
		for(int i=0; i<26; i++) {
			q.push(tem[i]);
			len++;
		}
		if(len==1){
			sum=q.top();
		}
		else{
			while(q.size()>1){
				int a=q.top();
				q.pop();
				int b=q.top();
				q.pop();
				sum+=a+b;
				q.push(a+b);
			}
		}
		q.pop();
		if(sum>n)
			cout<<"no"<<endl;
		else
			cout<<"yes"<<endl;

	}
}

VJ

http://vjudge.net/contest/view.action?cid=49918#problem/A

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
priority_queue <int,vector <int>,greater <int> > q;
int main() {
	int n;
	while(cin>>n) {
		int len=1;
		for(int i=0; i<n; i++) {
			long long t;
			cin>>t;
			q.push(t);
			len++;
		}
		long long sum=0;
		if(len==1) {
			sum=q.top();
		} else {
			while(q.size()>1) {
				long long a=q.top();
				q.pop();
				long long b=q.top();
				q.pop();
				sum+=a+b;
				q.push(a+b);
			}
		}
		q.pop();
		cout<<sum<<endl;
	}
}

字典树

在这里插入图片描述

HUD2072为例

http://acm.hdu.edu.cn/showproblem.php?pid=2072

#include<iostream>
#include<string.h>
#include<sstream>
using namespace std;
int dict[10005][26];
int vis[10005];
int ans,k;
void insert (string s) {
	int len = s.size();
	int root = 0;
	for (int i = 0; i < len; i++) {
		int index = s[i] - 'a';
		if (!dict[root][index]) {
			dict[root][index] = ++k;
		}
		root = dict[root][index];
	}
	if(!vis[root]){
		vis[root]=1; 
		ans++;
	}
}

int main() {
	string s;
	while(getline(cin,s)) {
		if(s[0]=='#')return 0;
		memset(dict,0,sizeof(dict));
		memset(vis,0,sizeof(vis));
		stringstream ss(s);
		string s1;ans=0;
		while(ss>>s1) {
			insert(s1);//插入一个单词 
		}
		cout<<ans<<endl;
	}
}

HUD1251为例

http://acm.hdu.edu.cn/showproblem.php?pid=1251

#include<iostream>
#include<string>
using namespace std;
int dict[1000005][30];
int vis[1000005];
int ans,k;
void insert (string s) {
	int len = s.size();
	int root = 0;
	for (int i = 0; i < len; i++) {
		int index = s[i] - 'a';
		if (!dict[root][index]) {
			dict[root][index] = ++k;
		}
		root = dict[root][index];
		vis[root]++;//每个子串都赋值为1,则abcd里找a,ab,abc,abcd,
		//对应的vis[root]都有 ,并且重复前缀累加vis值 
	}
}
void find (string s) {
	int root = 0;
	int len = s.size();
	for (int i = 0; i < len; i++) {
		int index = s[i] - 'a';
		if(!dict[root][index]) {//如果bc,找abc的前缀,必然不存在以bc为前缀,
		//此时dict[root][index]没有被insert() 赋值,所有为0,检测到直接cout<<0退出即可 
			cout<<0<<endl;
			return ;
		}
		else {
			root=dict[root][index];
		}
	}
	cout<<vis[root]<<endl;//为前缀的单词的数量
}
int main() {
	string s;
	while(getline(cin,s)) {
		if(s[0]=='\0')break;
		insert(s);
	}
	while(cin>>s) {
		find(s);
	}
}

01字典树

HUD4825

http://acm.hdu.edu.cn/showproblem.php?pid=4825

#include<iostream>
#include<stdio.h>
#include<string.h> 
using namespace std;
int dict[3200005][2];
int vis[3200005];
int ans,k;
int n,m;
void insert (int s) {
	int root = 0;
	for (int i = 31; i>=0; i--) {
		int index = (s>>i) & 1;//从高位到低位,存储该数的二进制编码 
		if (!dict[root][index]) {
			dict[root][index] = ++k;
		}
		root = dict[root][index];
	}
	vis[root]=s;//标记数字s的编码root为s 
}
void find (int s) {
	int root = 0;
	for (int i = 31; i>=0; i--) {
		int index = (s>>i) & 1;//位移出每一位 
		if (dict[root][index^1]) {//因为是异或,101与010匹配,所以优先考虑与当前index互斥的数
			root = dict[root][index^1];
		} 
		else {
			root = dict[root][index];//,如果互斥的分支没有那没办法了  
		}
	}
	cout<<vis[root]<<endl;//最后通过标记输出与哪个数最匹配即可 
}
int main() {
	int t;
	scanf("%d",&t);
	for(int i=1; i<=t; i++) {
		memset(dict,0,sizeof(dict));
		k=0;
		scanf("%d%d",&n,&m);
		for(int j=1; j<=n; j++) {
			int cnt;
			scanf("%d",&cnt);
			insert(cnt);
		}
		cout<<"Case #"<<i<<":"<<endl;
		for(int j=1; j<=m; j++) {
			int cnt;
			scanf("%d",&cnt);
			find(cnt);
		}
	}
}
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 13:54:33  更:2021-07-22 13:55:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 18:27:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码