2017 哈理工低年级组院赛初赛 H-魔法阵 【规律】

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

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

n-1 n-1

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

i=0 j=0

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

例如:

shift(ACC,0)=ACC

shift(ACC,1)=CCA

shift(ACC,2)=CAC

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

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

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

F(CCA,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

第一个字符串中每一位在第二个字符串中出现的次数相乘得数依次相加最后乘以字符串长度;
#include
using namespace std;
string a, b;
#define ll long long
int a1[26], a2[26];
int main()
{
    int N;
    cin >> N;
    while (N--)
    {
        long long ans = 0;
        cin >> a >> b;
        memset(a1, 0, sizeof a1);
        memset(a2, 0, sizeof a2);
        for(int i = 0; i < a.length(); i++){
            a1[a[i] - 'A']++;
            a2[b[i] - 'A']++;
        }
        for(int i = 0; i < 26; i++)
        {
            a1[i] *= a2[i];
            ans += a1[i];
        }
        ans *= a.length();
        cout << ans << endl;
    }
}

你可能感兴趣的:(2017院赛)