標籤:blog os for io 演算法 div
[i,j]是迴文串 若 str[i-1]==str[j+1]則 [i-1,j+1]也是迴文串。
#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<stack>#include<list>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<set>using namespace std;int Max(int a,int b){ return a>b?a:b;}char str[1111111];int dp[5555][5555];int main(){ int n; while(~scanf("%d",&n)!=EOF){ for(int k=0;k<n;k++){ int ans=0; scanf("%s",str+1); memset(dp,0,sizeof(dp)); for(int i=1;str[i];i++){ dp[i][i]=1; if(str[i]==str[i+1]) dp[i][i+1]=1; } int len=0; for(int i=1;str[i];i++) len++; for(int i=1;i<=len;i++){ for(int j=1;j+i<=len;j++){ int cc=i+j; if(str[j]==str[cc]) if(dp[j+1][cc-1]) dp[j][cc]=1; if(dp[j][cc]) ans=Max(ans,i+1); // printf("%d %d %d",i,i+j,dp[i][j+i]);system("pause"); } } printf("%d\n",ans); } } return 0;}
從中間向兩邊跑
#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<stack>#include<list>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<set>#include <fstream>using namespace std;string expand(string s1,int a,int b){ int l=a;int r=b; int len=s1.length(); while(l>=0&&r<len&&s1[l]==s1[r]){ l--;r++; } return s1.substr(l+1,r-l-1);}string Max(string a,string b){ if(a.length()>b.length()) return a; else return b;}string str;int main(){ int n; while(scanf("%d",&n)!=EOF){ for(int k=0;k<n;k++){ cin>>str; string longest = str.substr(0,1); int len=str.length(); for(int i=0;i<len;i++){ longest=Max(longest,expand(str,i,i)); // printf("%d ",i); // cout<<longest<<endl; // system("pause"); } for(int i=0;i<len;i++){ if(str[i]==str[i+1]) longest=Max(longest,expand(str,i,i+1)); } printf("%d\n",longest.length()); } } return 0;}
O(n)的演算法。
#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<stack>#include<list>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<set>#include <fstream>using namespace std;int Min(int a,int b){ return a>b?b:a;}int p[1111111];char str[1111111],s1[1111111];int len;void pk(){ int mx=0;int id; for(int i=1;i<len;i++){ if(mx>i){ p[i]=Min(p[id*2-i],mx-i); } else p[i]=1; for(;s1[i-p[i]]==s1[i+p[i]];p[i]++); if(p[i]+i>mx){ mx=p[i]+i; id=i; } }}int main(){ int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%s",str); s1[0]=‘.‘; s1[1]=‘#‘; len=strlen(str); for(int j=0;j<len;j++){ s1[2*j+2]=str[j]; s1[2*j+3]=‘#‘; } len=len*2+1; int ans=0; pk(); for(int i=1;i<len;i++) if(ans<p[i]) ans=p[i]; printf("%d\n",ans-1); } } return 0;}