wrong answer 无数次,然后把ios::sync_with_stdio(false)删掉,就ac了,至今不知道原因
#include <iostream>
#include <algorithm>
#include <string>
#include <stack>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
char source[100], target[100];
int dp[100][100];
int len1, len2;
int solve1(char* source, char* target)
{
for (int i = 0; i <= len1; ++i)
dp[i][0] = i;
for (int i = 0; i <= len2; ++i)
dp[0][i] = i;
for (int i = 1; i <= len1; ++i)
{
for (int j = 1; j <= len2; ++j)
{
if (source[i - 1] == target[j - 1])
dp[i][j] = dp[i - 1][j - 1];
else
{
int Del = dp[i - 1][j] + 1;
int Rep = dp[i - 1][j - 1] + 1;
int Ins = dp[i][j - 1] + 1;
dp[i][j] = min(Del, min(Rep, Ins));
}
}
}
cout << dp[len1][len2] << endl;
return dp[len1][len2];
}
bool flag;
enum MyEnum
{
Del, Rep, Ins, None
}op;
int main(void)
{
while (scanf("%s", source) != EOF)
{
scanf("%s", target);
len1 = strlen(source);
len2 = strlen(target);
int ans = solve1(source, target);
for (int i = len1, j = len2, k = 1; k <= ans;)
{
if (i == 0 && j != 0)
op = Ins;
else if (i != 0 && j == 0)
op = Del;
else
{
int t = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1]));
if (t == dp[i][j - 1])
op = Ins;
if (t == dp[i - 1][j])
op = Del;
if (t == dp[i - 1][j - 1])
op = dp[i - 1][j - 1] == dp[i][j] ? None : Rep; //可以覆盖之前确定的op
}
switch (op)
{
case Del:printf("%d Delete %d\n", k++, i--);
break;
case Rep:printf("%d Replace %d,%c\n", k++, i--, target[--j]);
break;
case Ins:printf("%d Insert %d,%c\n", k++, i + 1, target[--j]);
break;
case None:
--i, --j;
break;
default:
break;
}
}
}
return 0;
}