• 蓝桥杯训练5


    1366 : 逆序单词

    • 时间限制:10000ms
    • 单点时限:1000ms
    • 内存限制:256MB

    描述
    在英文中有很多逆序的单词,比如dog和god,evil和live等等。

    现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词。

    输入
    第1行:1个整数,N,表示单词数量。2≤N≤50,000。

    第2…N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母。保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye)。

    输出
    第1行:1个整数,表示单词表中逆序单词的对数。

    样例输入

    6
    dog
    live
    hiho
    evil
    coder
    god
    

    样例输出

    2
    

    C++

    #include<bits/stdc++.h>
    using namespace std;
    map<string,int>m;
    int main(){
        int n,ans=0;
        scanf("%d",&n);
        string s;
        while(n--){
            cin>>s;
            m[s]++;
            reverse(s.begin(),s.end());
            if(m[s]) ans++;
        }
        printf("%d
    ",ans);
        return 0;
    }
    

    Java

    import java.util.HashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    public class Main {
    	
    	public static void main(String[] args) {
    		NiXuWord m = new NiXuWord();
    		m.handleInput();
    	}
    	
    	public void handleInput() {
    		Scanner in = new Scanner(System.in);
    		int n = 0;
    		if (in.hasNext())
    			n = in.nextInt();
    		while (n > 0 && in.hasNext()) {
    			n--;
    			String s = in.next().trim();
    			addAndCount(s); 
    		}
    		System.out.println(count);
    	}
    	
    	Set<String> dict = new HashSet<>();
    	int count = 0;
    	public void addAndCount(String word){
    		if(dict.contains(new StringBuilder(word).reverse().toString()))
    			count++;
    		dict.add(word);
    	}
    }
    

    python

    在这里插入代码片
    

    1039 : 字符消除

    链接https://hihocoder.com/problemset/problem/1039?sid=1476083

    题意描述
    小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:

    1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC",“CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB”。

    2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A"

    游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符(‘A’,‘B’或者’C’),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。

    请帮助小Hi计算要如何插入字符,才能获得最高得分。

    输入
    输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

    之后T行每行一个由’A’‘B’'C’组成的字符串s,长度不超过100。

    输出
    对于每一行输入的字符串,输出小Hi最高能得到的分数。

    提示
    第一组数据:在"ABCBCCCAA"的第2个字符后插入’C’得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的’C’)。

    第二组数据:“AAA"插入’A’得到"AAAA”,消除后得到"",总共消除4个字符。

    第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。

    样例输入

    3
    ABCBCCCAA
    AAA
    ABC
    

    样例输出

    9
    4
    2
    

    分析

    1. 在给定字符串中的任意位置插入’A’、’B’、’C’中的任意一个字符,然后计算插入后的字符经过消除后最短的字符串长度;
    2. 在计算字符消除后最短长度时,智能一遍一遍的计算,个人没有想出什么更好地方法
    3. 记录每次插入一个字符后经过第2步计算后最短的字符串长度min,最后原字符串的长度-min+1。

    C++

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int cmd(const string &s){
        string str = s;
    
        while(1){
            if(str.size()==0) return 0;
            vector<char> v;
            char pre = str[0];
            int num = 1;
            for(int i=1; i<str.size(); i++){
                if(pre == str[i]) ++num;
                else {
                 if(num==1) v.push_back(pre);
                 pre = str[i];
                 num = 1;
                }
            }
            if(num ==1) v.push_back(pre); // the last one
            if(str.size()==v.size()) break;
            str = string(v.begin(), v.end());
        }
        return str.size();
    }
    
    int main(){
        int N;
        cin >> N;
        string s;
        while(N--){
            cin >> s;
            int m = s.size();
            for(int i=0; i<s.size(); i++){       
                for(char ch = 'A'; ch <= 'C'; ++ch)
                {
                    string newStr = s.substr(0, i) + ch + s.substr(i);
                    int len = cmd(newStr);
                    if(len < m) m = len;
                }
            }
            cout << s.size() + 1 - len << endl;
        }
        return 0;
    }
    
    import java.util.Scanner;
    public class Main {
    	public static void main(String[] args) {
    	
    		Scanner scan = new Scanner(System.in);
    		int time = scan.nextInt();
    		for(int i = 0;i < time;i++){
    			StringBuffer buffer = new StringBuffer(scan.next());
    			int min = buffer.length();
    			for(int j = 0;j < buffer.length();j++){
    				for(char ch = 'A';ch <= 'C';ch++){
    					StringBuffer temp = new StringBuffer(buffer);
    					temp = temp.insert(j, ch);
    					int count = handle(temp);
    					min = min > count ? count : min;  //越来越小
    				}		
    			}
    			System.out.println(buffer.length() + 1- min);
    		}
    	}
    	public static int handle(StringBuffer buffer){	
    		int count=0;
    		while(true){
    			StringBuffer temp = new StringBuffer();
    			int i = 0,j = 1;
    			for(;j < buffer.length();j++){		
    				if(buffer.charAt(i) != buffer.charAt(j)){
    					temp.append(buffer.charAt(i));
    				}else{
    					while(j < buffer.length()&& buffer.charAt(i) == buffer.charAt(j))
    						j++;
    				}
    				i = j;
    			}
    			if(j == buffer.length()){
    				temp.append(buffer.charAt(i));
    			}
    			if(buffer.length() == temp.length()){
    				count = temp.length();
    				break;
    			}
    			buffer = temp;
    		}
    		return count;
    	}
    }
    

    python

    import sys
    import re
     #首先要考虑插入一个字母,位置可以是字符串中的任意一个位置,我也没多想这里直接用字符串拼接来完成。
     #对于消除操作,写了一个函数来做这件事情,要消除所有连续出现的相同字母,直接用re的替换函数来实现,
     #直到findall()函数返回空表示已经消除完成。
    if __name__ == "__main__":
        def eliminate_string(s):
            pat = re.compile(r"A{2,}|B{2,}|C{2,}")
            while pat.findall(s):
                s = re.sub(pat, "", s)
            return s
     
        numLines = int(sys.stdin.readline())
        for i in range(1, numLines + 1):
            line = sys.stdin.readline()
            oldLen = len(line)
            minLen = oldLen
            for insertIndex in range(0, oldLen - 1):
                for c in ("A", "B", "C"):
                    newLine = line[:insertIndex] + c + line[insertIndex:]  # 插入一个字母后的字符串
                    lineLeft = eliminate_string(newLine)
                    if len(lineLeft) < minLen:
                        minLen = len(lineLeft)
                        minLine = lineLeft
            print oldLen - minLen + 1  # 算的是插入一个字母之后的消除长度
    

    马虎的算式

    小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
    有一次,老师出的题目是:36 x 495 = ?
    他却给抄成了:396 x 45 = ?
    但结果却很戏剧性,他的答案竟然是对的!!
    因为 36 * 495 = 396 * 45 = 17820
    类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
    假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
    能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

    C

    #include<stdio.h>
    int main(){
    	int a,b,c,d,e,n=0;// ab * cde = adb * ce
    	for(a=1;a<10;a++){
    		for(b=1;b<10;b++){
    			for(c=1;c<10;c++){
    				for(d=1;d<10;d++){
    					for(e=1;e<10;e++){	
    					if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e) 
    						if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
    						n++;
    					}
    				}	
    			}
    		}
    	}
    	printf("%d",n);
    	return 0;
    }
    

    JAVA

    public class Main {
    	
    	public static void main(String[] args) {
    		int a,b,c,d,e,sum=0;
    	    for(a=1;a<10;a++){
    	        for(b=1;b<10;b++){
    	            if(b!=a){
    	                for(c=1;c<10;c++){
    	                    if(c!=a&&c!=b){
    	                        for(d=1;d<10;d++){
    	                            if(d!=a&&d!=b&&d!=c){
    	                                for(e=1;e<10;e++){
    	                                    if(a!=e&&b!=e&&c!=e&&d!=e){
    	                                    	if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)){
    	                                    	sum++;
    	                                        }
    	                                    }
    	                                }
    	                            }
    	                        }
    	                    }
    	                }
    	            }
    	        }
    	    }
    	    System.out.print(sum);
    	}
    }
    

    python

    不想写
    

    猜字谜

    把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
    接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
    得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
    答案是一个小写字母。不要填写任何多余的内容。
    C

    #include <stdio.h>
    int main(){
    	char a[2020],s[20]="abcdefghijklmnopqrs";
    	int i,len,k=0;
    	for(i=0;i<106;i++){
    		strcat(a,s);//连接字符串的函数
    	}
    	while(k!=1){
    		k=0;
    		for(i=0;a[i];i++){
    			if(i%2==1){//删除奇数,则要取奇数下标的数
    				a[k++]=a[i];
    			}
    		}
    		a[k]="";
    	}
    	printf("%s",a);
    	return 0;
    } 
    

    参考的C++

    #include <iostream>
    using namespace std;
     
    int main(){
    	string s="abcdefghijklmnopqrs";
    	string ss;
    	for(int i=0;i<106;i++){
    		ss+=s;		//拼接106次 
    	}
    	while(ss.size()>1){		//判断循环结束 
    		for(int i=0;i<ss.size();i++){
    			ss.replace(i,1,"");		//replace()函数 的使用 
    		}
    	}
    	cout<<ss;
    	return 0;
    }
     
    /*
    知识点 
    	replace()函数: 
    	
    	用str中的num个字符替换本字符串中的字符,从index开始 
    	用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,最多num1个字符 
    	用str中的num个字符(从index开始)替换本字符串中的字符 
    	用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,num1个字符 
    	用num2个ch字符替换本字符串中的字符,从index开始 
    	用str中的字符替换本字符串中的字符,迭代器start和end指示范围 
    	用str中的num个字符替换本字符串中的内容,迭代器start和end指示范围, 
    	用num个ch字符替换本字符串中的内容,迭代器start和end指示范围. 
    	
    	例如,以下代码显示字符串"They say he carved it himself...find your soul-mate, Homer." 
    	    string s = "They say he carved it himself...from a BIGGER spoon";
    	    string s2 = "find your soul-mate, Homer.";
    	
    	    s.replace( 32, s2.length(), s2 );
    	
    	    cout << s << endl;
    	
    */
    

    java

    public class Main {
    	public static void main(String[] args) {
    		StringBuffer a = new StringBuffer();
    		for(int i=1; i<106; i++){
    			a.append("abcdefghijklmnopqrs");
    		}
    		while (a.length() > 1) {
    			for(int i=0; i<a.length(); i++){
    				a.deleteCharAt(i);
    			}
    		}
    		System.out.println(a);
    	}
    }
    

    python

    不写
    
    欢迎查阅
  • 相关阅读:
    TCP/IP详解学习笔记(4)-- ARP 和 RARP
    TCP/IP详解学习笔记(3)-- IP:网际协议
    TCP/IP详解学习笔记(2)-- 数据链路层
    TCP/IP详解学习笔记(1)-- 概述
    3D滚动下拉菜单-简直不要太任性
    Bootstrap的字体文件woff2 报错
    一步一步来做WebQQ机器人-(五)(发送消息||完结)
    一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)
    一步一步来做WebQQ机器人-(三)(登录QQ并保持在线)
    一步一步来做WebQQ机器人-(二)(第一次登陆)
  • 原文地址:https://www.cnblogs.com/gh110/p/12158145.html
Copyright © 2020-2023  润新知