hdu5340Three Palindromes 最长字符串

;const int maxn = 40010 ;char str[maxn] ;char s[maxn] ;int p[maxn] ;int pre[maxn] ;int suf[maxn] ;int n ;void pk(){int i;int mx = 0;int id;for(i=1; i<n; i++){if( mx > i )p[i] = min( p[2*id-i], mx-i );elsep[i] = 1;for(; str[i+p[i]] == str[i-p[i]]; p[i]++);if( p[i] + i > mx ){mx = p[i] + i;id = i;}}}bool solve(){for(int i = 4;i < n – 3;i++)for(int j = (str[i] == ‘#’ ? 2 : 1);j <= p[i] ;j++)if(i – j == 1 || i + j == n-1)continue ;else if(pre[i – j]&suf[i + j])return true ;return false ;}int main(){//freopen(“in.txt” ,”r” , stdin) ;int T ;scanf(“%d” ,&T) ;while(T–){scanf(“%s” , s) ;int len = strlen(s) ;n = 1;for(int i = 0; i < len ;i++){str[n++] = ‘#’ ;str[n++] = s[i] ;}str[n++] = ‘#’ ;pk() ;int ma = 0;memset(pre , 0 , sizeof(pre));memset(suf ,0 , sizeof(suf)) ;for(int i = 1 ;i < n ;i++){if(i == p[i])pre[i + p[i] – 1] = 1;if(p[i] == (n-i))suf[i – p[i] + 1] = 1;}if(solve())puts(“Yes”);else puts(“No”) ;}return 0 ;}

,总结失败的原因能够让人越来越谨慎。

hdu5340Three Palindromes 最长字符串

相关文章:

你感兴趣的文章:

标签云: