标签:
/*
*区间贪心。前几天刚做了POJ 1328 ...思路完全相同...
*最多有100个表情,100行文字。遍历寻找每个表情的所在区间。时间复杂度大约在10^5 ~ 10^6 可以接受。
*然后对每个表情按照右坐标排序。改变表情的最右边的字符。贪心判断是否更改。
*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
char emo[110][20];
char txt[110][100];
int n, m;
int cnt = 0;
int ans = 0;
struct E
{
int l, r;
} e[10010];
void ask()
{
for (int i=0; i<m; ++i) // 遍历文档
{
int lent = strlen(txt[i]);
for (int j=0; j<lent; ++j)
{
for (int k=0; k<n; ++k) //遍历表情看是否在当前文档中
{
bool flag = false;
int lene = strlen(emo[k]);
if (j+lene-1 > lent) continue;
if (txt[i][j] == emo[k][0] && txt[i][j+lene-1] == emo[k][lene-1])
{
flag = true;
for (int p=1; p<lene; ++p)
{
if (txt[i][j+p] != emo[k][p])
{
flag = false;
break;
}
}
}
if (flag)
{
e[cnt].l = j;
e[cnt++].r = j+lene-1;
//cout << txt[i] << "++++" << emo[k] << endl;
}
}
}
}
}
int cmp(E a, E b)
{
if (a.l != b.l)
return a.l < b.l;
return a.r < b.r;
}
void work()
{
ans += 1;
int temp = e[0].r;
for (int i=1; i<cnt; ++i)
{
if (e[cnt].l < temp && e[cnt].r > temp)
{
continue;
}
else
{
temp = e[cnt].r;
ans += 1;
}
}
}
int main()
{
while(cin >> n >> m)
{
ans = 0;
cnt = 0;
for (int i=0; i<n; ++i)
{
cin >> emo[i];
}
getchar();
for (int i=0; i<m; ++i)
{
gets(txt[i]);
}
ask(); //遍历寻找每个表情的区间范围
sort(e, e+cnt, cmp); // 对每个表情按照区间右边的值从大到小排序。
work(); // 求解。
cout << ans << endl;
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/icode-girl/p/4683425.html