<span>蓝桥杯训练5</span>
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
分析
- 在给定字符串中的任意位置插入’A’、’B’、’C’中的任意一个字符,然后计算插入后的字符经过消除后最短的字符串长度;
- 在计算字符消除后最短长度时,智能一遍一遍的计算,个人没有想出什么更好地方法
- 记录每次插入一个字符后经过第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
不写