1.hdu--4513 吉哥系列故事——完美队形II
http://acm.hdu.edu.cn/showproblem.php?pid=4513
题意:中文题不解释
思路:数字型的manachar算法。将模板中的比较字符改为比较数字就行了。
AC代码:
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 int a[200005],p[200005],k[200005]; 8 int manachar(int len) 9 { 10 int maxn,mx,id,i; 11 maxn=mx=id=0; 12 memset(p,0,sizeof(p)); 13 for(i=1; i<len; i++) 14 { 15 if(mx>i) 16 p[i]=min(p[id*2-i],mx-i); 17 else 18 p[i]=1; 19 for(; a[i-p[i]]==a[i+p[i]]&&p[i]<=k[i]; p[i]++) 20 if(p[i]+i>mx) 21 { 22 mx=p[i]+i; 23 id=i; 24 } 25 if(p[i]>maxn) 26 maxn=p[i]; 27 } 28 printf("%d ",maxn-1); 29 return 0; 30 } 31 int main() 32 { 33 int i,t,n; 34 while(~scanf("%d",&t)) 35 { 36 while(t--) 37 { 38 scanf("%d",&n); 39 memset(a,0,sizeof(a)); 40 memset(k,0,sizeof(k)); 41 a[0]=-1; 42 for(i=0; i<n; i++) 43 { 44 scanf("%d",&a[i*2+2]); 45 if(a[i*2+2]>=a[i*2]) 46 { 47 k[i*2+1]=k[i*2]+1; 48 k[i*2+2]=k[i*2]+2; 49 } 50 else 51 k[i*2+2]++; 52 //printf("%d %d ",i*2+2,k[i*2+2]); 53 } 54 manachar(2*n+2); 55 } 56 } 57 return 0; 58 }
2.hdu--3294 Girls' research
http://acm.hdu.edu.cn/showproblem.php?pid=3294
题意:先输入一个字符ch表示该字符的real是‘a’,循环对应的ch-1的real是‘z’,再输入一个字符串,求这个字符串real值的最大回文串,如果有多个结果输出第一个。输出最大回文串的左端点值和右端点值,如果回文串长度是1的话打印“No solution!”
思路:先把给的字符串改成real串,再求最大回文串,并记录real串的左右端点。
AC代码:
1 #include <iostream> 2 #include<cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 char ch,s[200005],str[400005]; 8 int p[400005]; 9 int manachar(int len) 10 { 11 int maxn,mx,id,pi; 12 maxn=mx=id=0; 13 memset(p,0,sizeof(p)); 14 for(int i=1;i<len;i++) 15 { 16 if(mx>i) 17 p[i]=min(p[id*2-i],mx-i); 18 else 19 p[i]=1; 20 for(;str[i-p[i]]==str[i+p[i]];p[i]++) 21 { 22 if(p[i]+i>mx) 23 { 24 mx=p[i]+i; 25 id=i; 26 } 27 } 28 if(maxn<p[i]) 29 { 30 pi=i; 31 maxn=p[i]; 32 } 33 } 34 maxn--; 35 if(maxn<3) 36 printf("No solution! "); 37 else 38 { 39 printf("%d %d ",(pi-maxn)/2,(pi+maxn-2)/2); 40 for(int i=pi-maxn+1;i<=pi+maxn-1;i=i+2) 41 printf("%c",str[i]); 42 printf(" "); 43 } 44 return 0; 45 } 46 int main() 47 { 48 while(~scanf("%c",&ch)) 49 { 50 getchar(); 51 gets(s); 52 str[0]='$',str[1]='#'; 53 int len=strlen(s); 54 for(int i=0;i<len;i++) 55 { 56 if(s[i]>=ch) 57 str[i*2+2]=s[i]-(ch-'a'); 58 else 59 str[i*2+2]=s[i]+26-(ch-'a'); 60 str[i*2+3]='#'; 61 } 62 str[len*2+2]='