F - Censor SCU - 4438(Hash字符串+前缀和)

SCU—4438

F - Censor SCU - 4438(Hash字符串+前缀和)_第1张图片
题意:一个敏感词w和一个文本p,在文本中不断地删除敏感词w,求最后的剩下的文本p。

思路:求出敏感词的hash值,定p的每一个字符都是以第一个字符开始的一个句子,求出它们的hash值入栈,当某一段的hash值等于敏感词的hash值时,将这段字符出栈。

#include

#define ull unsigned long long
using namespace std;
const int maxn=5000006;

ull base =131;
ull g[maxn];
ull p[maxn];

ull Hash(char s[])
{
    int n=strlen(s+1);
    g[0]=0;
    for(int i=1;i<=n;i++)
    {
        g[i]=g[i-1]*base+s[i];
    }
    return g[n];
}

void getp()
{
    p[0]=1;
    for(int i=1;i<=maxn;i++)
    {
        p[i]=p[i-1]*base;
    }
}

ull getLR(int l, int r)//取出T里l - r里面的字符串的hash值
{
    return g[r]-g[l-1]*p[r-l+1];
}

char s[5000060], t[5000060], ans[5000060];

int main()
{
    getp();
    while(~scanf("%s%s",s+1,t+1))
    {
        int Ls=strlen(s+1), Lt=strlen(t+1);
        ull key = Hash(s);
        int tot=0;
        for(int i=1;i<=Lt;i++)
        {
            ans[++tot]=t[i];
            g[tot]=g[tot-1]*base+t[i];
            if(tot>=Ls&&g[tot]-g[tot-Ls]*p[Ls]==key)
            {
                tot-=Ls;
            }
        }
        ans[tot+1]=0;
        printf("%s\n",ans+1);
    }

    return 0;
}
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         The program have no BUG.
*/

你可能感兴趣的:(字符串—hash)