zoukankan      html  css  js  c++  java
  • 2020浙江省省赛 C

    传送门

    题意

    这个题面又臭又长,比赛如果读了,肯定能过了,毕竟map水过都行,但可惜赛后读题,机翻都能读假题。

    题目大意就是,大家英语填词都玩过吧,给你n * n的填好的图,再给m个单词,就是让你从这m个单词中选符合条件,填进去。如果图里出现的单词(单词只能从左到右(或者从上到下)直至遇到#,算一个单词),在m个单词里没出现就输出-1。每个单词都有价值,图里出现几次,价值 * 出现次数。然后输出总价值。

    最后ac情况来看,好像出题数据没有

    ###
    #a#
    ###
    

    这个居然算两次出现a单词,我还特判了算一个……然后大写的wa
    (小声bb,横着a单词和竖着a单词算出现两次,然后最后这个图的总价值2*a的价值,但当时读完题感觉这个图的总价值就是a的价值,可能还是我题面依旧没读清……)

    思路

    思路有两种

    一用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!=''){
            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!='')
        {
            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]='';trie_insert(root,ss);cou++;l=0;}
                    }
                    else{
                        ss[l++]=s[i][j];
                    }
                }
                if(l!=0){ss[l]='';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]='';trie_insert(root,ss);cou++;l=0;}
                    }
                    else{
                        ss[l++]=s[i][j];
                    }
                }
                if(l!=0){ss[l]='';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
    ",sum);
            else
                printf("-1
    ");
            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]='';mp[ss]++;cou++;l=0;}
                    }
                    else{
                        ss[l++]=s[i][j];
                    }
                }
                if(l!=0){ss[l]='';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]='';mp[ss]++;cou++;l=0;}
                    }
                    else{
                        ss[l++]=s[i][j];
                    }
                }
                if(l!=0){ss[l]='';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
    ",sum);
            else
                printf("-1
    ");
        }
        return 0;
    }
    

    吐槽,这题英文题面太无语了,机翻,我还以为m个单词中出现了图里没有的直接-1,wa爆炸……语文阅读理解-1-1

  • 相关阅读:
    java常用类-----String类的源码分析、可变和不可变序列
    java常用类-----包装类及自动装箱和拆箱
    java数组---------二分查找_折半检索
    java数组------冒泡排序和优化
    java数组--------多维数组及数组存储表格数据
    java数组------Arrays工具类使用
    Volley超时重试机制
    Volley框架原理
    模块化实现(好处,原因)
    Android系统显示原理
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/13857616.html
Copyright © 2011-2022 走看看