- 1. 阿狸的英文名
阿狸最近想起一个英文名,于是他在网上查了很多个名字。他发现一些名字可以由两个不同的名字各取一部分得来,例如John(约翰)的前缀 “John”和Robinson(鲁滨逊)的后缀 “son” 连在一起就是Johnson.
现在他找到了两个喜欢的名字(名字可看作字符串),用A和B表示,他想知道取A的一个非空前缀和B的一个非空后缀,连接在一起能组成多少不同的字符串。
输入格式
输入两行,分别表示字符串A和B;字符串只包含小写英文字母。
输出格式
输出一行,一个整数,表示能得到多少不同的字符串。
输入样例 |
输出样例 |
cat dog |
9 |
tree heap |
14 |
数据范围和约束:
30%的数据:字符串长度不超过2000
100%的数据:字符串长度不超过100000
题解说这是一道签到题。。。大爷的我居然爆0。。。
其实就是水题一道,统计A串中除了首字母的其它字母出现次数,统计B串中除了尾字母的其它字母出现次数,然后用总方案数减去那些重复了的。
#include <cstdio> #include <cstring> const int maxn = 100005; int n, m; char a[maxn], b[maxn]; long long s[2][26], ans; inline long long getnum(int left, int right, char ch) { if (left <= 0) { left = 1; } return s[right][ch - 'a'] - s[left - 1][ch - 'a']; } /* interesting veryexciting */ int main(void) { scanf("%s%s", a + 1, b + 1); n = strlen(a + 1); m = strlen(b + 1); ans = (long long)n * (long long)m; for (int i = 2; i <= n; ++i) { ++s[0][a[i] - 'a']; } for (int i = 1; i < m; ++i) { ++s[1][b[i] - 'a']; } for (int i = 0; i < 26; ++i) { ans -= s[0][i] * s[1][i]; } printf("%lld ", ans); return 0; }