#10049. 「一本通 2.3 例 1」Phone List

trie树简单题。
需要注意一下数组范围,以及建树查找的顺序,以实现代码简洁明了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
const int N=1e4+5,L=10;  //N是字符串的个数,L是字符串的最大长度,数组范围应该是:min(N*L,L^L) 
int tot,trie[N*L][10],cnt[N*L];
int T,n;
bool jay;
struct number{int len; char s[L];}num[N];

inline void build(char str[],int rt)
{
	int len=strlen(str);
	for (register int i=0; i<len; ++i)
	{
		int x=str[i]-'0';
		if (!trie[rt][x]) trie[rt][x]=++tot;
		rt=trie[rt][x];
		if (i==len-1) cnt[rt]++;
	}
}

inline bool find(char str[],int rt)
{
	int len=strlen(str);
	for (register int i=0; i<len; ++i)
	{
		int x=str[i]-'0';
		if (!trie[rt][x]) return false;
		rt=trie[rt][x];
		if (cnt[rt]) return true;
	}
	return false;
}

inline bool cmp(number a,number b)
{
	return a.len<b.len;
}

//虽然是一本通例题的第一题,但是也不是那么容易。
//首先要将字符串按照长度从小到大进行排序,对于一次build,把字符串的最后一个字符位置的cnt++。 
//排完序后就可以保证当查找到一个cnt不为0时,即为成功。 
int main(){
	scanf("%d",&T);
	while (T--)
	{
		jay=false;
		tot=0; memset(trie,0,sizeof(trie)); memset(cnt,0,sizeof(cnt));
		scanf("%d",&n);
		for (register int i=1; i<=n; ++i) 
		{
			scanf("%s",num[i].s);
			num[i].len=strlen(num[i].s);
		}
		sort(num+1,num+n+1,cmp);
		for (register int i=1; i<=n; ++i)
		{
			if (find(num[i].s,0)) {jay=true; break;}
			build(num[i].s,0);
		}
		if (jay) puts("NO");
		else puts("YES");
	}
return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
print("开始执行推荐算法....") #spark.sql(etl_sql).write.jdbc(mysql_url, 'task888', 'overwrite', prop) # 获取:用户ID、房源ID、评分 etl_rdd = spark.sql(etl_sql).select('user_id', 'phone_id', 'action_core').rdd rdd = etl_rdd.map(lambda x: Row(user_id=x[0], book_id=x[1], action_core=x[2])).map(lambda x: (x[2], x[1], x[0])) # 5.训练模型 model = ALS.train(rdd, 10, 10, 0.01) # 7.调用模型 products_for_users_list = model.recommendProductsForUsers(10).collect() # 8.打开文件,将推荐的结果保存到data目录下 out = open(r'data_etl/recommend_info.csv', 'w', newline='', encoding='utf-8') # 9.设置写入模式 csv_write = csv.writer(out, dialect='excel') # 10.设置用户csv文件头行 user_head = ['user_id', 'phone_id', 'score'] # 12.写入头行 csv_write.writerow(user_head) # 13.循环推荐数据 for i in products_for_users_list: for value in i[1]: rating = [value[0], value[1], value[2]] # 写入数据 csv_write.writerow(rating) print("推荐算法执行结束,开始加工和变换推荐结果....") # 14.读取推荐的结果 recommend_df = spark \ .read \ .format('com.databricks.spark.csv') \ .options(header='true', inferschema='true', ending='utf-8') \ .load("data_etl/recommend_info.csv") # 注册临时表 recommend_df.createOrReplaceTempView("recommend") # 构造 spark执行的sql recommend_sql = ''' SELECT a.user_id, a.phone_id, bid,phone_name, phone_brand, phone_price, phone_memory ,phone_screen_size,ROUND(score,1) score FROM recommend a,phone b WHERE a.phone_id=b.phone_id ''' # 执行spark sql语句,得到dataframe recommend_df = spark.sql(recommend_sql) # 将推荐的结果写入mysql recommend_df.write.jdbc(mysql_url, 'recommend', 'overwrite', prop) 解释一下这段代码
最新发布
06-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值