我是靠谱客的博主 曾经枫叶,最近开发中收集的这篇文章主要介绍【dtoj begin#4211】「TDog 2021 S Day5 」单词,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

传送门

题目描述

给你两个由小写字母组成的单词 A A A B B B,我们称一个单词为幸运单词,当且仅当它是由 A A A 的某个非空前缀和 B B B 的某个非空后缀拼接而成的( A A A 的前缀在 B B B 的后缀的前面)。

例如,当单词 A A A t r e e tree tree,单词 B B B h e a p heap heap 时, t r a p trap trap 就是一个幸运单词,而 t r a e p , a p t r traep,aptr traep,aptr 则不是。

请问对于给定的单词 A A A B B B,共有多少个不同的幸运单词?

输入格式

输入包含两行,第一行为单词 A,第二行为单词 B。

输出格式

输出一个整数,表示幸运单词的总个数。

样例输入
cat
dog
样例输出
9
数据范围与提示

20 % 20% 20%的数据,单词A的长度 l e n g t h A length_A lengthA和单词B的长度 l e n g t h B length_B lengthB满足, 1 ≤ l e n g t h A , l e n g t h B ≤ 100 1 leq length_A,length_B leq 100 1lengthA,lengthB100
40 % 40% 40%的数据, 1 ≤ l e n g t h A , l e n g t h B ≤ 1 0 3 1 leq length_A,length_B leq 10^3 1lengthA,lengthB103
100 % 100% 100%的数据, 1 ≤ l e n g t h A , l e n g t h B ≤ 1 0 5 1 leq length_A,length_B leq 10^5 1lengthA,lengthB105

题解

先上结论:答案是 l e n g t h A × l e n g t h B − ∑ i x i × y i length_A times length_B - sum_i x_i times y_i lengthA×lengthBixi×yi(其中 x i , y i x_i,y_i xiyi分别是单词A、单词B中字母i的个数)
理解的方式有很多,我的理解是这样的:(两个单词长度相乘不用说)
单词B的后缀等价于前后反转后的前缀倒过来。
把单词A中的字母表示为 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,反转后的单词B中的字母表示为 b 1 , b 2 , . . . , b m b_1,b_2,...,b_m b1,b2,...,bm
易知只有长度相同的单词才会出现重复的情况。那么,随便举个例子,长度为5的拼接后单词可能为:
a 1 b 4 b 3 b 2 b 1 a_1b_4b_3b_2b_1 a1b4b3b2b1
a 1 a 2 b 3 b 2 b 1 a_1a_2b_3b_2b_1 a1a2b3b2b1
a 1 a 2 a 3 b 2 b 1 a_1a_2a_3b_2b_1 a1a2a3b2b1
a 1 a 2 a 3 a 4 b 1 a_1a_2a_3a_4b_1 a1a2a3a4b1
其中,若 a 2 a_2 a2 b 4 b_4 b4相同,就会带来一次重复的计算。
a 3 a_3 a3 b 3 b_3 b3相同,也会带来一次重复的计算。
……
然而我们发现,除了A的首字母和B的尾字母,在拼接后单词不同的长度下,所有的相同字母都可以这样组成配对,带来重复的计算。所以就可以推出重复计算的总个数。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e5+5;
ll ans,al,bl,bka[30],bkb[30];
char A[M],B[M];
int main(){
	scanf("%s%s",&A,&B);
	al=strlen(A);
	bl=strlen(B);
	for(int i=1;i<al;i++) bka[(int)(A[i]-'a')]++;
	for(int i=0;i<bl-1;i++) bkb[(int)(B[i]-'a')]++;
	ans+=al*bl;
	for(int i=0;i<=25;i++) ans-=bka[i]*bkb[i];
	printf("%lldn",ans);
	return 0;
}

Thanks!

最后

以上就是曾经枫叶为你收集整理的【dtoj begin#4211】「TDog 2021 S Day5 」单词的全部内容,希望文章能够帮你解决【dtoj begin#4211】「TDog 2021 S Day5 」单词所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部