您的位置:首页 > 其它

NOJ [1273] So Long the String

2014-11-17 23:27 323 查看
链接地址:http://ac.nbutoj.com/Problem/view.xhtml?id=1273

遍历?

如果你将每个短字符串的每个字符都去长字符串中查找有木有,那一定会超时。

本题正规算法:二分法

先将长字符串从小到大排序。
然后用二分法查找长字符串中是否有他的位置。
然后逐个查找,关键就是二分法的思想。
现在给你们讲讲二分法的好处。
假如我这里有100000个不同的数,然后我跟你讲一个数X,问你我这里的100000个数里是否有X这个数。如果你在我这里的数,从第一个开始找,一直找下去,最少1次找到,最多100000次才找到,那么平均大概需要找50000次才能找到。
然后我们来看看二分法。
我们先将这100000个数排序,然后我们将X与这100000个数的中间那个数比较一下,如果X比那个数小,那么X只可能存在1到50000个数的范围里;如果X比那个数大,那么X只可能存在50001到100000个数的范围里。假如他在1到50000个数的范围里,那么我们再将X与这50000个数的中间那个数比较,重复上面的情况。最终肯定会找到X或者直到找到只剩下一个数了结束。
算一下复杂度。
假如我有2个数,我大约寻找1次就够了。
假如我有4个数,我大约寻找2次就够了。
假如我有8个数,我大约寻找3次就够了。
假如我有1024个数,我大约寻找10次就够了。
假如我有2^100个数,我大约寻找100次就够了。
100000个数大约17次就找到了

其实还有另一种简便方法,自己去琢磨

下面是二分法代码。
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int p;
char a[100010];
char b[110];

void find(char x, int xx, int yy)
{
if (x == a[(xx + yy) / 2]) return;
if (xx == yy)
{
p = 1;
return;
}
if (x < a[(xx + yy) / 2]) find(x, xx, (xx + yy) / 2);
else find(x, (xx + yy) / 2 + 1, yy);
}

int main()
{
int n, m, x, y;

//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout);
while (~scanf("%s", a))
{
int n = strlen(a);
sort(a, a + n);
int m;
scanf("%d", &m);
while (m--)
{
scanf("%s", b);
int s = strlen(b);
p = 0;
for (int i = 0; i < s; i++)
{
if (b[i] == a[n / 2]) continue;
if (b[i] < a[n / 2]) find(b[i], 0, n / 2);
else find(b[i], n / 2 + 1, n - 1);
if (p) break;
}
if (p == 0) printf("YES\n");
else printf("NO\n");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: