POJ 3865 - Database 字符串hash
【题意】
给一个字符串组成的矩阵,规模为n*m(n<=10000,m<=10),如果某两列中存在两行完全相同,则输出NO和两行行号和两列列号,否则输出YES
【题解】
因为m很小,所以对每一行枚举其中两个字符串,检查之前行中对应的两列里是否重复即可。但是如何判重。
一开始想的把字符串做成pair然后用map映射为行号,但是TLE。
后来想到用hash判重,可能是因为哈希函数不够好,还是TLE。。。
总之这道题卡了三个小时,一直TLE。
枚举每一列,对枚举到的那一列从小到大排序,然后找到相邻两个相等的,接着在相同行,不同列中寻找相等的字符串,如果存在表示找到解。复杂度是m^2*n*logn,处于可以接受的范围。
最后的方法在POJ上使用C++通过,但是G++却超时了。
曾经记得POJ有一道题是使用G++通过,C++超时,总之以后在POJ上超时了就两个编译器都试试。
在看别人的代码时,发现有人用了字符串hash读入:
typedef unsigned long long ULL;
ULL hash(char *s) {
ULL res = ;
for(int i = ; s[i]; ++i) {
res *= ;//质数
res += s[i];
}
return res;
}
这样做比较速度相当快,程序用时不到1s。
因为没有处理冲突,所以可以用这个方法水过去(笑)
代码:(没有用字符串hash)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define eps 1e-9
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
using namespace std;
typedef long long LL;
int i,j,k,n,m,x,T,ans,big,cas,num,len,nodenum,l;
bool flag;
char s[],t[];
int pre;
string y[][]; string ex;
struct node
{
string st;
int i;
} G[]; bool cmp(node a,node b)
{
return a.st<b.st;
} int main()
{
scanf("%d%d",&n,&m);
gets(s);
for (i=;i<=n;i++)//读入
{
gets(s);
len=strlen(s);
s[len]=',';
s[len+]='\0';
pre=;
num=;
for (j=;j<=len;j++)
{
if (s[j]==',')
{
s[j]='\0';
y[i][++num]=(s+pre); pre=j+;
}
}
} for (i=;i<=m;i++)//枚举列
{
for (j=;j<=n;j++)//把这一列复制一遍后排序
{
G[j].st=y[j][i];
G[j].i=j;
}
sort(G+,G++n,cmp); for (j=;j<=n;j++)//枚举行
{
for (k=j+; k<=n && G[k].st==G[j].st ;k++)//向下找与第j行相同的行
{
for (l=i+;l<=m;l++)//再枚举其他列,检查是否有重复
{
if ( y[ G[j].i ][l]==y[ G[k].i ][l] )//存在重复
{
printf("NO\n");
printf("%d %d\n",G[j].i,G[k].i);
printf("%d %d\n",i,l);
return ;
}
}
}
}
} printf("YES\n");
return ;
}
POJ 3865 - Database 字符串hash的更多相关文章
- Palindrome POJ - 3974 (字符串hash+二分)
Andy the smart computer science student was attending an algorithms class when the professor asked t ...
- POJ 3974 - Palindrome - [字符串hash+二分]
题目链接:http://poj.org/problem?id=3974 Time Limit: 15000MS Memory Limit: 65536K Description Andy the sm ...
- POJ 1200 字符串HASH
题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- POJ 1743 Musical Theme (字符串HASH+二分)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15900 Accepted: 5494 De ...
- poj 3461 字符串单串匹配--KMP或者字符串HASH
http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...
- 字符串hash - POJ 3461 Oulipo
Oulipo Problem's Link ---------------------------------------------------------------------------- M ...
- poj 1200字符串hash
题意:给出不同字符个数和子串长度,判断有多少个不同的子串 思路:字符串hash. 用字符串函数+map为什么会超时呢?? 代码: #include <iostream> #include ...
- POJ 3461 Oulipo(字符串hash)
题目链接 字符串hash判断字符串是否相等. code #include<cstdio> #include<algorithm> #include<cstring> ...
随机推荐
- springmvc问题汇总
1. IncompatibleClassChangeError in spring mvc Failed to read candidate component class....... ...
- Linux命令学习计划【sed】
引言: Sed命令是linux里用于文本行处理的命令. 为了便于说明,我在/usr/dict下创建了字典words并以此作为演示模板 先用nl 打印下words内容: *打印篇: Q1:如何打印某一行 ...
- 2.2.2 从 Path 中获取信息
Demo: import java.nio.file.Path; import java.nio.file.Paths; public class PathInfoTest { public stat ...
- jvectormap 中国地图 (包括香港、台湾、澳门)
一个完整的中国地图(各个省,市.还有国两制),谢谢大家. 忘了网上哪位的范例,我加了些修改. <html xmlns="http://www.w3.org/1999/xhtml&quo ...
- DEDE站点从网站根目录移到子目录
修改DedeCms系统配置参数-站点设置 a.站点根网址修改为:http://域名/子目录 b.网页主页链接:/子目录 修改DedeCms系统配置参数-核心设置 a.安装目录:/子目录 批量修改原数据 ...
- C++学习笔记4——类的封装(2)
简介: 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.其中一元运算符有一个参数,二元运算符有两个参数. 可以被重载的运算符 + - * / % ^ ...
- Solr4.8.0源码分析(2)之Solr的启动(一)
上文写到Solr的启动过程是在SolrDispatchFilter的init()里实现,当Tomcat启动时候会自动调用init(); Solr的启动主要在 this.cores = createCo ...
- 转:hadoop知识整理
文章来自于:http://tianhailong.com/hadoop%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86.html 按照what.how.why整理了下文章,帮助 ...
- C#程序设计基础——变量
变量表示数值,字符串值或类的对象.变量存储的值可能会发生更改,但名称保持不变.C#是一种强类型语言,在变量中存储值之前,必须指定变量的类型. 变量的命名规则: 1-变量只能有字母,数字和下划线三种字符 ...
- (转载)python多行注释
(转载)http://www.cnblogs.com/pylemon/archive/2011/05/23/2054090.html python本身不带多行注释,编辑时每行敲一个“#”相当的不方便, ...