列表

详情


NC14540. 魔法阵

描述

 这是mengxiang000Tabris来到幼儿园的第七天,mengixang000发动了一个魔法阵,能够召唤出来两只逗逼兽.每只逗逼兽都有自己的名字,而且两只逗逼兽的名字长度是相同的,逗逼兽是要成对出现的才有战斗力,其战斗力是根据其名字而决定的,如果其中一只的名字是s,另外一只的名字为t,那么其战斗力为:

n-1 n-1

Σ  Σ  F(shift(s,i),shift(t,j));

i=0 j=0

shiftsi)表示是以字母s[i]开头的字符串.

例如:

shiftACC,0=ACC

shiftACC,1=CCA

shiftACC,2=CAC

F(字符串A,字符串B)=字符串A和字符串B对应相同位子上相同字母的个数和,现在已知两只逗逼兽的名字,求其战斗力。

例如,如果某只逗逼兽的名字是ACC,另一只逗逼兽的名字是ACG那么这两只逗逼兽的战斗力的值就是:

FACC,ACG+F(ACC,CGA)+F(ACC,GAC)+

FCCA,ACG+F(CCA,CGA)+F(CCA,GAC)+

F (CAC,ACG) +F(CAC,CGA)+F(CAC,GAC)

=2+0+1+1+2+0+0+1+2=9

输入描述

第一行输入一个整数t,表示一共的测试数据组数。
每组数据输入两行,每行输入一只逗逼兽的名字,保证两只逗逼兽的名字长度相同,保证输入的字符都是大写字母。
t<=100
1<=逗逼兽的名字的长度<=100000

输出描述

每组数据输出一行,包含一个整数,表示两只逗逼兽的战斗力。 (保证输出结果在2^60以内)

示例1

输入:

1
ACC
ACG

输出:

9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 326ms, 内存消耗: 31492K, 提交时间: 2018-02-20 20:23:55

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		while (n-- > 0) {
			String str1 = sc.next();
			String str2 = sc.next();
			int []array = new int[100000];
			for(int i=0;i<str1.length();i++) {
				array[str1.charAt(i)-'A']++;
			}
			long num = 0;
			for(int j=0;j<str2.length();j++) {
				num = num+array[str2.charAt(j)-'A'];
			}
			System.out.println(num*str1.length());
		}
		
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 32ms, 内存消耗: 1452K, 提交时间: 2019-08-21 16:52:24

#include<iostream>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		string a,b;
		cin>>a>>b;
		int c[1000]={0},d[1000]={0};
		for(int i=0;i<a.length();i++){
			c[a[i]-64]++;
			d[b[i]-64]++;
		}
		long long sum=0;
		for(int i=0;i<300;i++){
			sum=sum+c[i]*d[i];
		}
		cout<<sum*a.length()<<endl;
	}
}

上一题