这个题中,a串和b串能组成的新串个数为strlen(a)*strlen(b)。但是其中会有一些重复的字符串,所以只要找出其中重复的串就行。
当然要如何找很重要:
1.abb和ba会有两个重复的串,所以为3 * 2 - 2;
2.abb和bba会有四个重复的串,所以为3 * 3 - 4;
3.abba和bbac会有五个重复的串,所以为4 * 4 - 5;
所以a串不看第一个字母,b串不看最后一个字母,从a串的第二个字母遍历到最后一个字母
1.b字母在第一个串出现两次,b字母在第二个串出现一次
2.b字母在第一个串出现两次,b字母在第二个串出现两次
3.b字母在第一个串出现两次,b字母在第二个串出现两次,接下来是a字母在两个串出现各一次(不算第二个串中的最后一个字母)
统计对象:第一个字符串第二个字母到最后一个字母,第二个字符串从第一个字母到倒数第二个字母。
统计第一个串中的每个字母在第二个串中出现的次数,次数的总和就是重复字符串的数量。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1e5 + 10;
int main()
{
freopen("concatenation.in", "r", stdin);
freopen("concatenation.out", "w", stdout);//打开文件
char a[N], b[N];
cin >> a >> b;
long long len1 = strlen(a);
long long len2 = strlen(b);
int ch1[1000];
memset(ch1, 0, sizeof(ch1));
//记录a串中字母出现的次数
for (int i = 1; i < len1; i++)//注意是从第二个字母开始统计
{
ch1[a[i]]++;
}
long long sum = len1 * len2, cnt = 0;
//找出b串每个字母在a串中出现的次数
for (int i = 0; i < len2 - 1; i++)//注意统计到倒数第二个字母
{
if (ch1[b[i]])
{
cnt += ch1[b[i]];
}
}
long long x = sum - cnt;
cout << x << endl;
}