Palindromes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1065 Accepted Submission(s): 461
Now give you a string S, you should count how many palindromes in any consecutive substring of S.
Proceed to the end of file.
aba aa
4 3//首先得压缩,不然肯定在n=5000时超时,压缩后在匹配,注意也是有方法的!#include<iostream> #include<string.h> using namespace std;
int hash[5005]; char str[5005]; char ts[5005];
int main() { int i,len,k,count,j,t,temp; bool flag; while(scanf("%s",str)!=EOF) { // memset(hash,0,sizeof(hash)); len=strlen(str); hash[0]=1; ts[0]=str[0]; k=0; for(i=1;i<len;i++) { if(str[i-1]==str[i]) { hash[k]++; } else { k++; hash[k]=1; ts[k]=str[i]; } }
count=0; for(i=0;i<=k;i++) count+=(hash[i]+1)*hash[i]/2;
/* // 超时 for(i=0;i<=k;i++) { for(j=i+1;j<=k;j++) { temp=hash[i]<hash[j]?hash[i]:hash[j]; for(t=1;t<=(j-i)/2;t++) { if(ts[i+t]==ts[j-t]&&hash[i+t]==hash[j-t]) count+=temp; } } } */ int l,r; for(i=0;i<=k;i++) { flag=true; l=i-1; r=i+1; if(!(l>=0&&r<=k)) continue; while(ts[l]==ts[r]&&hash[l]==hash[r]) { count+=hash[r]; l--; r++; if(!(l>=0&&r<=k)) { flag=false; break; } } if(flag&&ts[l]==ts[r]) count+=(hash[l]<hash[r]?hash[l]:hash[r]); } /* for(i=0;i<=k;i++) { int a=i-1; int b=i+1; if(a<0||b>k) continue; flag=0; while(ts[a]==ts[b]&&hash[a]==hash[b]) { count+=hash[a]; a--; b++; if(a<0||b>k) { flag=1; break; } } if(flag==0&&ts[a]==ts[b]) { count+=hash[a]>hash[b]?hash[b]:hash[a]; } }*/ //cout<<count<<endl; printf("%d\n",count); } return 0; }