比赛时这道题并没多想,当高放说是区间覆盖贪心的时候,已崩溃,区间贪心前两天刚做过,poj 1328,还打了博客,结果比赛时就是没想到。。
这道题算是一道稍微麻烦点。。
题意:
其实就是对每一行分别使用贪心,最后把修改的点的和加起来
参考链接:http://www.cnblogs.com/cheater/p/4675043.html
我和参考中的贪心代码有点不同,他是从后往前搜,排序是x.l<y.;个人认为其实没必要当x.l==y.l时,x.r<y.r
我是从前往后搜,排序是x.r<y.r;
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
string A[1050], B[1050];
struct pos
{
int L, R;
} p[10050];
bool cmp(pos A, pos B)
{
if (A.L != B.L)
{
return A.L < B.L;
}
return A.R < B.R;
}
void solve()
{
int cnt = 0;
for (int i = 1; i <= m; i++)
{
int lenB = B[i].length();
int q = 1;
for (int j = 0; j < lenB; j++)
{
for (int k = 1; k <= n; k++)
{
int lenA = A[k].length();
if (j+lenA-1 >= lenB) continue;
if (A[k][0] == B[i][j] && A[k][lenA-1] == B[i][j+lenA-1])
{
bool ok = true;
for (int l = 0; l < lenA; l++)
{
if (A[k][l] != B[i][j+l])
{
ok = false;
break;
}
}
if (ok)
{
p[q].L = j;
p[q++].R = j+lenA-1;
}
}
}
}
p[0].L = p[0].R = -100;
sort(p+1, p+q, cmp);
/* for (int i = 1; i < q; i++) {
printf("%d %d\n", p[i].L, p[i].R);
}
puts("");
*/
for (int i = q-1; i >= 1; i--)
{
if (p[i].L > p[i-1].R)
{
cnt++;
}
else
{
for (int j = i-1; j >= 1; j--)
{
if (p[i].L <= p[j].R) ;
else
{
i = j+1;
cnt++;
break;
}
}
}
}
}
cout << cnt << endl;
}
int main()
{
while (cin >> n >> m && (n && m))
{
for (int i = 1; i <= n; i++)
{
cin >> A[i];
}
getchar();
for (int i = 1; i <= m; i++)
{
getline(cin, B[i]);
}
solve();
}
return 0;
}