SCU4438-Censort
2017-04-26 18:47
162 查看
题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4438
题意:给出两个字符串A, B, 要求每次将B中第一次出现的A删除, 然后将B剩下的两段前后合并, 然后重复这个过程直到没有可以删除的A位置, 问最后剩下的串是什么
解题思路:链表+kmp,对字符串A做kmp,然后和字符串B进行匹配
题意:给出两个字符串A, B, 要求每次将B中第一次出现的A删除, 然后将B剩下的两段前后合并, 然后重复这个过程直到没有可以删除的A位置, 问最后剩下的串是什么
解题思路:链表+kmp,对字符串A做kmp,然后和字符串B进行匹配
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <bitset> using namespace std; #define LL long long const int INF = 0x3f3f3f3f3f; char a[5000010]; char b[5000010]; int nt[5000010]; int nex[5000010]; int p[5000010]; int len1, len2; void getNext() { nt[0] = -1; for (int i = 0; i < len1; i++) { int k=nt[i]; while (k>0&& a[i]!=a[k]) k = nt[k]; nt[i + 1] = k + 1; } } int main() { while (~scanf("%s%s",a,b)) { len1 = strlen(a), len2 = strlen(b); if (len1 > len2) { printf("%s\n", b); continue; } getNext(); for (int i = 0; i <= len2; i++) { nex[i] = i + 1; p[i] = i - 1; } for (int i = 0, j = 0; i < len2;) { if (j < len1 && b[i] == a[j]) j++; else { while (j >=0&&b[i]!=a[j]) j = nt[j]; j++; } if (j == len1) { int x = i; for (int k = 0; k < len1; k++) i = p[i]; if (i == -1) { p[nex[x]] = -1; i = nex[x]; j = 0; continue; } else { nex[i] = nex[x]; p[nex[x]] = i; for (int k = 1;k<len1 ; k++) { if (p[i] != -1) i = p[i]; else break; } j = 0; } } else i = nex[i]; } int cnt=0,k = len2; while (p[k] != -1) { a[cnt++] = b[p[k]]; k = p[k]; } for (int i = cnt - 1; i >= 0; i--) printf("%c", a[i]); printf("\n"); } return 0; }
相关文章推荐
- SCU 4438 Censor(KMP / HASH)
- SCU 4438
- SCU - 4438(KMP)
- scu 4438 Censor
- SCU 4438 Censor
- SCU 4438
- SCU 4438:Censor
- SCU 4438
- SCU 4438
- SCU 4438 Censor (KMP)
- SCU 4438
- SCU 4438 Censor KMP/Hash
- SCU 4438 Censor (2015四川省省赛C题)
- SCU 4438
- SCU - 4438 Censor 【字符串好题】
- SCU 4438 Censor (字符串哈希)
- SCU 4438
- SCU-4438 Censor(字符串HASH)
- SCU 4438
- 未解决 训练赛3 ,kmp || 字符串哈希(没学)Censor SCU - 4438