2020浙江省省赛 C
作者:互联网
题意
这个题面又臭又长,比赛如果读了,肯定能过了,毕竟map水过都行,但可惜赛后读题,机翻都能读假题。
题目大意就是,大家英语填词都玩过吧,给你n * n的填好的图,再给m个单词,就是让你从这m个单词中选符合条件,填进去。如果图里出现的单词(单词只能从左到右(或者从上到下)直至遇到#,算一个单词),在m个单词里没出现就输出-1。每个单词都有价值,图里出现几次,价值 * 出现次数。然后输出总价值。
最后ac情况来看,好像出题数据没有
###
#a#
###
这个居然算两次出现a单词,我还特判了算一个……然后大写的wa
思路
思路有两种
一用unordered_map存(亲测map也可以水过)存图里的单词和计算单词数,然后m单词查询的时候,加上出现次数 * 价值,用count+=出现次数,最后判断count==图里的单词数
二用trie,这里能力不行数组trie树会狂tle,只能用指针trie树,后面跟一操作一样
指针trie树的代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#define inf 0x7f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1050;
char s[N][N],ss[N];
typedef struct trie_node{
int count1;
trie_node *children[26];
}*trie;
trie_node* create_trie_node(){
trie_node* pNode = new trie_node();
pNode->count1 = 0;
for(int i=0; i<26; ++i)
pNode->children[i] = NULL;
return pNode;
}
void trie_insert(trie root, char* key){
trie_node* node = root;
char* p = key;
while(*p && *p!='\0'){
if(node->children[*p-'a'] == NULL){
node->children[*p-'a'] = create_trie_node();
}
node = node->children[*p-'a'];
++p;
}
node->count1 += 1;
}
int trie_search(trie root, char* key){
trie_node* node = root;
char* p = key;
while(*p && node!=NULL&& *p!='\0')
{
node = node->children[*p-'a'];
++p;
}
if(node == NULL)
return 0;
else
return node->count1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
trie root=create_trie_node();
scanf("%d%d",&n,&m);
int cou=0;
for(int i=0;i<n;i++){
scanf("%s",s[i]);
int l=0;
for(int j=0;j<n;j++){
if(s[i][j]=='#'){
if(l!=0){ss[l]='\0';trie_insert(root,ss);cou++;l=0;}
}
else{
ss[l++]=s[i][j];
}
}
if(l!=0){ss[l]='\0';trie_insert(root,ss);cou++;}
}
for(int j=0;j<n;j++){
int l=0;
for(int i=0;i<n;i++){
if(s[i][j]=='#'){
if(l!=0){ss[l]='\0';trie_insert(root,ss);cou++;l=0;}
}
else{
ss[l++]=s[i][j];
}
}
if(l!=0){ss[l]='\0';trie_insert(root,ss);cou++;}
}
ll sum=0,k;
for(int i=0;i<m;i++){
scanf("%s%lld",ss,&k);
int ci=trie_search(root,ss);
cou-=ci;
sum+=k*(ll)ci;
}
if(cou==0)
printf("%lld\n",sum);
else
printf("-1\n");
delete root;
}
return 0;
}
map的代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#define inf 0x7f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1050;
char s[N][N],ss[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
map<string,int>mp;
int cou=0;
for(int i=0;i<n;i++){
scanf("%s",s[i]);
int l=0;
for(int j=0;j<n;j++){
if(s[i][j]=='#'){
if(l!=0){ss[l]='\0';mp[ss]++;cou++;l=0;}
}
else{
ss[l++]=s[i][j];
}
}
if(l!=0){ss[l]='\0';mp[ss]++;cou++;}
}
for(int j=0;j<n;j++){
int l=0;
for(int i=0;i<n;i++){
if(s[i][j]=='#'){
if(l!=0){ss[l]='\0';mp[ss]++;cou++;l=0;}
}
else{
ss[l++]=s[i][j];
}
}
if(l!=0){ss[l]='\0';mp[ss]++;cou++;}
}
ll sum=0,k;
for(int i=0;i<m;i++){
scanf("%s%lld",ss,&k);
int ci=mp[ss];
cou-=ci;
sum+=k*(ll)ci;
}
if(cou==0)
printf("%lld\n",sum);
else
printf("-1\n");
}
return 0;
}
吐槽,这题英文题面太无语了,机翻,我还以为m个单词中出现了图里没有的直接-1,wa爆炸……语文阅读理解-1-1
标签:node,trie,单词,int,2020,省赛,include,浙江省,define 来源: https://www.cnblogs.com/luoyugongxi/p/13857616.html