UVALive 5876 Writings on the Wall

来源:互联网 发布:水妖钢笔 知乎 编辑:程序博客网 时间:2024/06/16 18:49

这道题数据很水,用哈希和暴力都可以水过去。
不过正解很巧妙,类似于HDU6096用ac自动机水过去的方法。
题目给出两个字符串sa和sb,于是构造一个sb+’?’+sa的字符串,对其跑KMP的失配函数,这样对于这个字符串结尾的所有的失配都是答案。

代码:

#include<bits/stdc++.h>using namespace std;const int N = 5e4+5;char s1[N], s2[2*N];int f[2*N];void solve(char *s) {    int l = strlen(s), ans = 0;    f[0] = f[1] = 0;    for(int i = 1; i < l; i++) {        int j = f[i];        while(j && s[i]!=s[j]) j = f[j];        f[i+1] = s[i]==s[j]?j+1:0;    }    while(l) { ans++; l = f[l]; }    printf("%d\n", ans);}int main() {    int T;    scanf("%d", &T);    while(T--) {        scanf("%s%s", s1+1, s2);        s1[0] = '?';        strcat(s2, s1);        solve(s2);    }    return 0;}
原创粉丝点击