Censor SCU - 4438
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf = 0x3f3f3f3f; 4 typedef long long int ll; 5 typedef unsigned long long int ull; 6 const int maxn = 5e6+10; 7 ull hs[maxn]; 8 ull base[maxn]; 9 char stra[maxn], strb[maxn]; 10 int lena,lenb; 11 ull num; 12 char ans[maxn]; 13 int main() { 14 while (scanf("%s%s", stra + 1,strb+1) != EOF) { 15 lena = strlen(stra + 1); 16 lenb = strlen(strb + 1);//读入串 17 num = 0; 18 base[0] = 1; 19 for (int i = 1;i < maxn;i++)base[i] = base[i - 1] * 131; 20 for (int i = 1;i <= lena;++i)num = (num * 131) + stra[i] - 'a' + 1;//初始化 21 int pos = 0; 22 for (int i = 1;i <= lenb;++i) { 23 ans[pos++] = strb[i]; 24 hs[pos] = hs[pos - 1] * 131 + strb[i] - 'a' + 1; 25 if (pos >= lena && hs[pos] - hs[pos - lena] * base[lena] == num) {//如果长度大于子串就判断,如果等于子串,pos就减掉子串的长度。 26 pos -= lena; 27 } 28 } 29 for (int i = 0;i < pos;i++) printf("%c", ans[i]); 30 puts(""); 31 } 32 return 0; 33 }