回文自动机板子

// test 
#include 

#define int long long 

#define x first
#define y second 
#define all(x) (x).begin(),(x).end()
#define pb push_back

using namespace std ;

int read(){
	int res = 0 , flag = 1 ;
	char c = getchar() ;
	while(!isdigit(c)){
		if(c == '-') flag = -1 ;
		c = getchar() ;
	}
	while(isdigit(c)){
		res = (res << 1) + (res << 3) + (c ^ 48) ;
		c = getchar() ;
	}
	return res * flag ; 
}

void write(int x){
	if(x < 0) {
		putchar('-') ;
		x = - x ;
	}
	if(x >= 10) write(x / 10) ;
	putchar('0' + x % 10) ;
}

void write(int x , char c){
	write(x) ;
	putchar(c) ; 
}


const int N = 2e6 + 10 ;
typedef pair<int , int> pii ;
typedef pair<double , double> pdd ;
const int inf = 1e9 + 10 ;
const int M = 2 * N ; 

int len[N] , fail[N] ;
string s ;
int num[N] ;
int nxt[N][26] ;
int tot = 1 ; 
int find(int x , int i) {
	while(i - len[x] - 1 < 0 || s[i - len[x] - 1] != s[i]) x = fail[x] ; 
	return x ; 
}

signed main(void){
	cin >> s ; 
	fail[0] = 1 ;
	len[1] = -1 ;
	int last = 0 ; 
	int pos = 0 ; 
	for(int i = 0 ; i < s.size() ; i ++) {
		s[i] = (s[i] - 97 + last) % 26 + 97 ; 
		// cout << s[i] ; 
		int t = find(pos , i) ;
		int c = s[i] - 'a' ; 
		if(nxt[t][c] == 0) {
			int tt = nxt[find(fail[t] , i)][c] ;
			++ tot ; 
			nxt[t][c] = tot ;
			len[tot] = len[t] + 2 ; 
			fail[tot] = tt ;
			num[tot] = num[tt] + 1 ; 
		}
		pos = nxt[t][c] ; 
		last = num[pos] ;
		write(last , ' ') ;
	}
}


你可能感兴趣的:(c++,算法,开发语言)