Censor
frog is now a editor to censor so-called sensitive words (敏感词).
She has a long text p
. Her job is relatively simple -- just to find the first occurence of sensitive word w
and remove it.
frog repeats over and over again. Help her do the tedious work.
Input
The input consists of multiple tests. For each test:
The first line contains 1
string w. The second line contains 1 string p
.
(1≤length of w,p≤5⋅106
, w,p
consists of only lowercase letter)
Output
For each test, write 1
string which denotes the censored text.
Sample Input
abc
aaabcbc
b
bbb
abc
ab
Sample Output
a
ab
题意: 给你两个字符串,要求每次可执行的操作是再下面的串里删去第一个串,直到不能删为止
思路分析 : 先对模式串进行一次 hash ,然后再对主串进行依次 hash ,然后依次检索每个位置,当二者的 hash 值相同时即代表是相同的字符串,在这里我们只是 hash 了一次,并且默认了不同的字符串hash值一定是不同的
代码示例:
using namespace std;
#define ll unsigned long long
const ll maxn = 5e6+5;
char a[maxn], b[maxn];
ll len1, len2;
ll hash_num;
ll p = 19873;
ll pp[maxn];
void init(){
pp[0] = 1;
for(ll i = 1; i <= 5000000; i++){
pp[i] = pp[i-1]*p;
}
}
void cal(){
hash_num = 0;
for(ll i = 1; i <= len1; i++){
hash_num = hash_num*p+(a[i]-'a');
}
}
ll sta[maxn];
ll ha[maxn];
bool check(ll pos){
if (pos >= len1 && ha[pos]-ha[pos-len1]*pp[len1] == hash_num){
return true;
}
return false;
}
int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
init();
while(~scanf("%s%s", a+1, b+1)){
len1 = strlen(a+1);
len2 = strlen(b+1);
cal();
//prllf("+++ %llu
", hash);
ll top = 1;
ha[0] = 0;
for(ll i = 1; i <= len2; i++){
sta[top] = b[i];
ha[top] = ha[top-1]*p+(b[i]-'a');
if (check(top)) top -= len1;
top++;
}
for(ll i = 1; i < top; i++){
printf("%c", sta[i]);
}
printf("
");
}
return 0;
}