UVA 11557 - Code Theft

题目链接

题意:给定一些代码文本。然后在给定一个现有文本,找出这个现有文本和前面代码文本,反复连续行最多的这些文本

思路:把每一行hash成一个值。然后对于每个文本计算最大匹配值,枚举后缀。然后利用KMP去找就可以

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <iostream>
#include <vector>
using namespace std; typedef unsigned long long ull; const ull X = 123;
const int N = 105; int n, next[1000005];
string name[N];
string s;
vector<int> ans;
vector<ull> code[N]; void hash(string s, int u) {
string ss = "";
int l = 0, r = s.length() - 1, len = s.length();;
while (s[l] == ' ' && l < len) l++;
while (s[r] == ' ' && r >= 0) r--;
for (int i = l; i <= r; i++) {
ss += s[i];
while (s[i] == ' ' && s[i + 1] == ' ' && i < r) i++;
}
if (ss == "") return;
ull ans = 0;
for (int i = ss.length() - 1; i >= 0; i--)
ans = ans * X + ss[i];
code[u].push_back(ans);
} void build(int i) {
code[i].clear();
while (getline(cin, s) && s != "***END***") {
hash(s, i);
}
} vector<ull> T; void getnext() {
int N = T.size();
next[0] = next[1] = 0;
int j = 0;
for (int i = 2 ; i <= N; i++) {
while (j && T[i - 1] != T[j]) j = next[j];
if (T[i - 1] == T[j]) j++;
next[i] = j;
}
} int find() {
int ans = 0;
int N = code[n].size(), m = T.size(), j = 0;
for (int i = 0; i < N; i++) {
while (j && code[n][i] != T[j]) j = next[j];
if (code[n][i] == T[j]) j++;
ans = max(ans, j);
if (j == m)
return m;
}
return ans;
} int cal(int u) {
int ans = 0;
int sz1 = code[u].size();
for (int i = 0; i < sz1; i++) {
T.clear();
for (int j = i; j < sz1; j++)
T.push_back(code[u][j]);
getnext();
ans = max(ans, find());
}
return ans;
} void solve() {
int Max = 0;
ans.clear();
for (int i = 0; i < n; i++) {
int tmp = cal(i);
if (tmp > Max) {
Max = tmp;
ans.clear();
ans.push_back(i);
}
else if (tmp == Max) ans.push_back(i);
}
cout << Max;
if (Max) {
for (int i = 0; i < ans.size(); i++)
cout << " " << name[ans[i]];
}
cout << endl;
} int main() {
while (cin >> n) {
getchar();
for (int i = 0; i < n; i++) {
getline(cin, name[i]);
build(i);
}
build(n);
solve();
}
return 0;
}

UVA 11557 - Code Theft (KMP + HASH)的更多相关文章

  1. UVA 11754 - Code Feat(数论)

    UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题, ...

  2. Codeforces 1090J $kmp+hash+$二分

    题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...

  3. 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈

    [BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...

  4. UVA 11475 后缀数组/KMP

    题目链接: 题意:给定一个只含字母的字符串,求在字符串末尾添加尽量少的字符使得字符串为回文串. 思路:因为只能从末尾添加字符,所以其实求的是最长的后缀回文串.那么添加的字符为除了这个原串的最长后缀回文 ...

  5. 【POJ2185】【KMP + HASH】Milking Grid

    Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...

  6. HDU 5782 Cycle(KMP+Hash)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5782 [题目大意] 给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位 ...

  7. Cycle (KMP + hash)

    题意:给你2个串,让你判断2个字符串的前缀是否满足首尾连接形成的环是不是一样的. 思路:我们需要提前知道的是满足条件的前缀一定满足 strA = str1 + str2, strB = str2 + ...

  8. bzoj4641 基因改造 KMP / hash

    依稀记得,$NOIP$之前的我是如此的弱小.... 完全不会$KMP$的写法,只会暴力$hash$.... 大体思路为把一个串的哈希值拆成$26$个字母的位权 即$hash(S) = \sum\lim ...

  9. UVa 11996 Jewel Magic (splay + Hash + 二分)

    题意:给定一个长度为n的01串,你的任务是依次执行如表所示的m条指令: 1 p c 在第p个字符后插入字符,p = 0表示在整个字符串之前插入2 p 删除第p个字符,后面的字符往前移3 p1 p2反转 ...

随机推荐

  1. VMware中CentOS6.5启动出现An error occurred during the file system check

     

  2. tensorflow学习之路---Session、Variable(变量)和placeholder

    ---恢复内容开始--- 1.Session '''Session.run():首先里面的参数是一个API(函数的接口)的返回值或者是指定参数的值:功能:得知运算结果有两种访问方式:直接建立或者运用w ...

  3. 【Django】Cookie

    目录 Cookie介绍 操作Cookie 获取Cookie 设置 Cookie 删除Cookie @ Cookie介绍 Cookie的由来 大家都知道==HTTP协议是无状态的==. ==无状态的的意 ...

  4. 【APP测试】APP弱网环境测试

    方法一:利用抓包工具 1.利用fiddler通过代理连接上手机之后,进入Fiddler->Rules->Customize Rules,点击弹出的CustomRules.js文件,找到m_ ...

  5. 51nod 最大子矩阵和

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 我们可以降维,枚举矩形的长,然后算出一个一维数组,然后就转化成了最大字段和问题 #include< ...

  6. 紫书 例题 9-8 UVa 1625 (滚动数组+公共字符串处理)

    这题看题解看了很久,学到了挺多(自己还是太弱,唉!) (1)这道题的思路非常的巧妙.我一开始看到就觉得不好来记录开始位置以及 结束位置.但是题解换了一个思路,记录每一次开始了但还没有结束的字符有多少个 ...

  7. 一招制胜---详解分布式系统里session同步

    一招制胜---详解分布式系统里session同步 几周前,有个盆友问老王,说现在有多台服务器,怎么样来解决这些服务器间的session同步问题?老王一下就来精神了,因为在n年以前,老王还在学校和几个同 ...

  8. CF(438D) The Child and Sequence(线段树)

    题意:对数列有三种操作: Print operation l, r. Picks should write down the value of . Modulo operation l, r, x. ...

  9. 开创学习的四核时代-iTOP-4412开发板开源硬件平台

    iTOP-4412开发板如今比較热门的开发板.笔者最近入了一套. 也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具高速读取与 ...

  10. RvmTranslator6.0

    RvmTranslator6.0 eryar@163.com 1. Introduction RvmTranslator can translate the RVM file exported by ...