比赛描述
Alice最近开始研究密码学,她发现变形词非常有用。两个字符串互为变形词,如果它们具有相同的字符。例如,字符串`”bacdc”和 `"dcbac"`互为变形词, 而字符串`"bacdc"`和`"dcbad"`则不是。
Alice决定采用一种加密方法,它依赖于使得两个大字符串成为变形词最少所要删除字符的字符总数。她需要你的帮助计算这个数。
给定两个字符串,帮助她计算出需要删除的最少字符数使它们成为变形词,两个字符串中的任意字符都可以被删除。
输入
两行,每行包含一个字符串A和B。
1 <= A,B的长度 <= 10000
A和B只包含小写的字母。
输出
一个整数,表示最少删除的字母个数。
样例输入
cde
abc
样例输出
4
算法课刚刚讲动态规划,一联想发现是最长公共子序列变形问题,直接dp,mle了一发,然后用滚动数组优化,tle了一发,233。说到底都是数据太大的问题。一看提交版竟然有0ms过的,忽然发现自己忘了一个叫哈希的东西,ac。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 10001
int Hash[26];
char a[maxn];
char b[maxn];
int main()
{
int sum=0;
scanf("%s",a);
memset(Hash,0,sizeof(Hash));
for(int i=0;i<strlen(a);i++){
Hash[a[i]-97]++;
}
scanf("%s",b);
for(int i=0;i<strlen(b);i++){
Hash[b[i]-97]--;
}
for(int i=0;i<26;i++){
if(Hash[i]>=0){
sum+=Hash[i];
}
else{
sum-=Hash[i];
}
}
printf("%d\n",sum);
return 0;
}