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\n",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]="\0";
	}
	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

不写