2016多校联合训练赛 第五场1002 Cycle hdu5782
2016-08-05 19:58
337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5782
题意:给出两个串,判断对所有的前i位是否循环相等,循环相等时输出1,否则输出0。
想法:一开始队友的想法是写一个与位置无关的哈希函数,然后判断哈希值是否相等,后来写出来一个纷繁复杂的东东,然后就WA了,我们也觉得改不出来错。后来我换了下思路,如果两个串循环相等的话,说明能找到一个位置,使得该位置的前缀等于另一个串同位置的后缀,那么好了,我们用扩展KMP找这个位置即可。同时还要维护一下该串是否字母种类和个数都相等,不相等的话直接输出0即可。
代码如下:
题意:给出两个串,判断对所有的前i位是否循环相等,循环相等时输出1,否则输出0。
想法:一开始队友的想法是写一个与位置无关的哈希函数,然后判断哈希值是否相等,后来写出来一个纷繁复杂的东东,然后就WA了,我们也觉得改不出来错。后来我换了下思路,如果两个串循环相等的话,说明能找到一个位置,使得该位置的前缀等于另一个串同位置的后缀,那么好了,我们用扩展KMP找这个位置即可。同时还要维护一下该串是否字母种类和个数都相等,不相等的话直接输出0即可。
代码如下:
#include <cstdio> #include <algorithm> #include <cstring> typedef long long ll; const int MAXN = 10000 + 100; const int N = 100 + 30; char s[MAXN], t[MAXN]; int nexta[MAXN], nextb[MAXN]; int ta[MAXN], tb[MAXN]; int a , b ; void KMP(char s[], char t[], int next[], int ex[]){ next[0] = 0; for (int i = 0, j = 0, p = -1; s[i] != '\0'; ++i, ++j, --p){ if(p == -1){ j = 0; do{ ++p; }while(s[i + p] != '\0' && s[i + p] == t[j + p]); ex[i] = p; }else if(next[j] != p){ ex[i] = std::min(next[j], p); }else{ j = 0; while(s[i + p] != '\0' && s[i + p] == t[j + p]){ ++p; } ex[i] = p; } if(s[i + 1] == '\0'){ ex[i + 1] = 0; } } return; } void init(){ memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); KMP(s + 1, s, nexta, nexta + 1); KMP(t, s, nexta, tb); KMP(t + 1, t, nextb, nextb + 1); KMP(s, t, nextb, ta); return; } int main(){ //freopen("2.in", "r", stdin); while(~scanf("%s %s", s, t)){ init(); int l = strlen(s); for (int i = 0; i < l; i++){ ++a[s[i]]; ++b[t[i]]; bool f = true, flag; for(int j = 0; j < N; ++j){ if(a[j] != b[j]){ f = false; break; } } if(f){ flag = false; for (int j = 0; j <= i; j++){ if(ta[i - j + 1] >= j && tb[j] >= i - j + 1){ flag = true; break; } } if(flag){ putchar('1'); }else{ putchar('0'); } }else{ putchar('0'); } } puts(""); } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002