题意:
解法:
满足条件的前缀:
1. 前面一半要等于后面一半.
2. 前面一半和后面一半都是回文.
判断条件1 可以用字符串hash,
判断条件2 也能用字符串hash.
因此hash一下就行了。
code:
#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
const int maxm= 2e5 + 5 ;
const int p= 1331 ;
ull h[ maxm] ;
ull h2[ maxm] ;
ull base[ maxm] ;
char s[ maxm] ;
int n;
ull ask ( int l, int r) {
return h[ r] - base[ r- l+ 1 ] * h[ l- 1 ] ;
}
ull ask2 ( int l, int r) {
return h2[ l] - base[ r- l+ 1 ] * h2[ r+ 1 ] ;
}
bool is ( int l, int r) {
if ( l== r) return 1 ;
int mid= ( l+ r) / 2 ;
if ( ( r- l+ 1 ) % 2 == 0 ) {
return ask ( l, mid) == ask2 ( mid+ 1 , r) ;
} else {
return ask ( l, mid- 1 ) == ask2 ( mid+ 1 , r) ;
}
}
void solve ( ) {
cin>> ( s+ 1 ) ;
n= strlen ( s+ 1 ) ;
base[ 0 ] = 1 ;
for ( int i= 1 ; i< maxm; i++ ) {
base[ i] = base[ i- 1 ] * p;
}
for ( int i= 1 ; i<= n; i++ ) {
h[ i] = h[ i- 1 ] * p+ s[ i] ;
}
for ( int i= n; i>= 1 ; i-- ) {
h2[ i] = h2[ i+ 1 ] * p+ s[ i] ;
}
int ans= 0 ;
for ( int i= 1 ; i<= n; i++ ) {
int mid= ( 1 + i) / 2 ;
if ( i% 2 ) {
if ( ! is ( 1 , mid) || ! is ( mid, i) ) continue ;
if ( ask ( 1 , mid) == ask ( mid, i) ) ans++ ;
} else {
if ( ! is ( 1 , mid) || ! is ( mid+ 1 , i) ) continue ;
if ( ask ( 1 , mid) == ask ( mid+ 1 , i) ) ans++ ;
}
}
cout<< ans<< endl;
}
signed main ( ) {
ios:: sync_with_stdio ( 0 ) ;
solve ( ) ;
return 0 ;
}