scu 4438 censor(KMP,栈保存匹配状态)
来源:互联网 发布:mac配套手绘板 编辑:程序博客网 时间:2024/06/07 21:57
题意:
重复,在t的起始找第一次出现的w,从t中删掉。
求最后的t。
思路:
T: 文本 , W: 关键词
KMP过程中T中每个位置都对应了一个W的失配函数值。
我们可以把任何一个状态拿出来,然后继续匹配下去。
匹配过程中把这些pair压入stack。
删除:弹出连续|W|个状态,于是状态回到|W|个字符前,继续与剩下的T进行匹配
const int Mxn = 5e6 + 5;char text[Mxn], ss[Mxn];int nxt[Mxn];void getNxt(const char s[], int len, int f[]) { f[0] = f[1] = 0; for(int i=2;i<=len;++i) { int j = f[i-1]; while ( j && s[j] != s[i-1] ) j = nxt[j]; if ( s[j] == s[i-1] ) ++j; f[i] = j; }}struct node { char x; int y; // x in t, y in p};// find p in tvoid kmp (char t[], int lent, char p[], int lenp) { getNxt ( p, lenp, nxt ); int j = 0, ret = 0; vector<node> stk; for(int i=0;i<lent;++i) { while ( j && p[j] != t[i] ) j = nxt[j]; if ( p[j] == t[i] ) ++j; // t的i位置对应p的失配点 stk.push_back( (node){t[i], j} ); if ( j == lenp ) { ++ ret; int c = lenp; while ( c-- ) stk.pop_back(); if ( stk.empty() ) j = 0; else j = stk.back().y; } } if ( stk.empty() ) puts(""); else { for(int i=0;i<stk.size();++i) putchar(stk[i].x); putchar('\n'); }}int main() {#ifndef ONLINE_JUDGE freopen("input.in", "r", stdin);#endif while ( scanf("%s%s", ss, text) != EOF ) { int len1 = strlen(text), len2 = strlen(ss); kmp(text, len1, ss, len2); } return 0;}
0 0
- scu 4438 censor(KMP,栈保存匹配状态)
- SCU 4438 Censor (KMP)
- SCU 4438 Censor KMP/哈希
- SCU 4438 Censor(KMP / HASH)
- SCU-4438 Censor(KMP算法)
- SCU 4438 Censor KMP/Hash
- SOJ 4438 Censor(KMP匹配)
- SCU-4438 Censor(字符串HASH)
- scu 4438 Censor
- 未解决 训练赛3 ,kmp || 字符串哈希(没学)Censor SCU
- 2015四川省赛 scu oj 4438 Censor
- SCU 4438 Censor (字符串哈希)
- SOJ 4438 Censor (字符串,kmp,hash,经典)
- SCU 4438 Censor (2015四川省省赛C题)
- scu 4438 Censor 字符串哈希+前缀和
- 2015 四川省赛 C Censor(哈希 | KMP)
- [SCU 4495] 单词替换 (KMP)
- [SCU 4511] 任务 (状态优化DP)
- 每日_BackgroundWorker
- 行动吧
- 实现jqGrid单元格编辑完后点击提交按钮一次性提交
- HTML5新特性
- 在 Cocos2d-x 中打开一个链接
- scu 4438 censor(KMP,栈保存匹配状态)
- 对卡尔曼滤波算法的一丝淡淡理解
- R语言——生物统计
- onNewIntent调用时机
- JAVA多线程断点续传下载
- 近期知识总结,包括git的使用
- vim中已有tab文件如何置换tab为空格
- Media Player控件使用
- [leetcode] Binary Search Tree Iterator