WA0求助
查看原帖
WA0求助
498612
Saka_Noa楼主2022/9/10 09:00
#include<bits/stdc++.h>
using namespace std;
#define f(i , a , b) for(int i = a;i <= b;i++)
#define N (int) (5 * (1e6) + 5)

int lena , lenb , ans;
int p[N] , f[N] ,Pre[N] , Sum[N] , hr[N] ;
char A[N] , B[N];


void Kmp_Self(int j = 0) {
	f (i , 2 , lenb) {
		while(j && B[i] != B[j + 1]) j = p[j];
		j += B[i] == B[j + 1];
		p[i] = j;
	}
} 

void Kmp(int j = 0) {
	f(i , 1 , lena) {
		while(j && A[i] != B[j + 1]) j = p[j];
		j += A[i] == B[j + 1];
		if(j == lenb) {
			f[i - lenb + 1] = 1;
			j = p[j];
		}
	}
}

void qr(char *D , int &len) {
	char c = getchar();
	len = 0;
	D[len++] = '~';
	D[len++] = '|';
	while(c < 'a' || c > 'z') c = getchar();
	while(c >= 'a' && c <= 'z') D[len++] = c,D[len++] = '|',c = getchar();
	len--;
}
int main() {
	scanf("%d %d",&lena , &lenb);
	
	qr(A,lena) , qr(B,lenb);
	
	Kmp_Self();
	Kmp();
	
	int cn = 0;
	f(i , 1 , lena) {
		//if(A[i] != '|') cn++;
		Sum[i] = Sum[i - 1] + f[i] * i ;
		Pre[i] = Pre[i - 1] + f[i] ;
	}
	//f(i , 1 , lena) printf("%c" , A[i]);
	//puts("");
	
	/*cout << A << endl << B << endl;
	
	f(i , 1 , lena) cout << Sum[i] << " ";
	cout << endl;
	f(i , 1 , lena) cout << Pre[i] << " ";
	cout << endl;
	f(i , 1 , lena) cout << f[i] << " ";
	cout << endl;*/
	
	
	for(int i = 1 , mid = 0 , r = 0 ; i <= lena ; i++) {
		if(i <= r) hr[i] = min(hr[(mid << 1) - i] , r - i + 1);
		while(A[i - hr[i]] == A[i + hr[i]]) {
			//if(Q[make_pair(i - hr[i] ,i + hr[i])] != 1) 
			//Q[make_pair(i - hr[i] ,i + hr[i])] = 1 , ans += f[i + hr[i]] -  f[i - hr[i] - 1];
			hr[i]++;
		}
		if(i + hr[i] > r) r = i + hr[i] - 1 , mid = i;
		
		//d[r] = max(d[r] , f[r] - f[mid - hr[mid]]);
		//printf("i : %d R : %d r : %d  \n",i,r,hr[i] );
	}
	
	//cout << A << endl;
	//f(i , 1 , lena) cout << hr[i] << " ";
	//cout << endl;
	
	f(i , 1 , lena) {
		int l = i - hr[i] + 1, r = i + hr[i] - lenb ;
		
		//cout << l << " " << r << endl;
		if(l > r) continue;
		int mid = (l + r) >> 1;
		//if(A[mid] == '|') continue;
		ans += Sum[mid] - Sum[l - 1] - (Pre[mid] - Pre[l - 1]) * (l - 1);
		if(mid != r)
		ans += (Pre[r] - Pre[mid]) * (r + 1) - (Sum[r] - Sum[mid]) ;
	}

	
	printf("%d" , ans);
	return 0;
}
2022/9/10 09:00
加载中...