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次就找到了
其实还有另一种简便方法,自己去琢磨
下面是二分法代码。
遍历?
如果你将每个短字符串的每个字符都去长字符串中查找有木有,那一定会超时。
本题正规算法:二分法
先将长字符串从小到大排序。
然后用二分法查找长字符串中是否有他的位置。
然后逐个查找,关键就是二分法的思想。
现在给你们讲讲二分法的好处。
假如我这里有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; }
相关文章推荐
- TRACE打印中文时输出_CrtDbgReport: String too long or IO ErrorThe program的解决办法
- Typically the sat nav not to mention interested in your follow might long been do not ever so easy not to mention more comfortable
- The method setValue(String) in the type ParamTag is not applicable for the arguments (long)
- The request filtering module is configured to deny a request where the query string is too long问题解决
- The method regist(int, String, long, Object...) of type PaymentProxy must override a superclass解决方式
- [AC自动机] zoj Searching the String
- HDU 3336 Count the string
- The method list(String, Object[]) is ambiguous for the type BaseHibernateDao<M,PK
- More about the Operations of string
- Find the Longest Word in a String
- android时间格式的转化,String,Date,long
- the method getcontextpath() from the type httpservletrequest refers to the missing type string
- Count the string (HDU_3336) 扩展KMP + dp
- The long way
- MySQL用into outfile导出出错The MySQL server is running with the --secure-file-priv option so it cannot ex
- Error: String or binary data would be truncated. The statement has been terminated
- java中数据类型转换 Integer String Long Float Double Date Char
- The StringFormat property
- Index and length must refer to a location within the string. Parameter name: length (mscorlib)
- The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files