159D回文串预处理

来源:互联网 发布:赵薇万惠事件知乎 编辑:程序博客网 时间:2024/05/19 14:34
/*求回文串组成的对数的总数 分析:现对数据进行预处理,求出第 i 个字符前面出现过多少个回文串然后 dp 的方法 :dp[i] = dp[i-1] + Sum{ g[j][i]==1?sum[j-1]:0 } g[j][i] == 1 , 则 string[j,i] 是回文串 */#include<iostream>#include<cstdio> #include<cstring>#include<algorithm>using namespace std;#define manx 2009char s[manx];long long dp[manx],g[manx][manx],sum[manx];int main(){    while(cin>>s+1){        int len = strlen(s+1);        memset(g,0,sizeof(g));        dp[0] = sum[0] = 0;        for(int i=1;i<=len;i++){            dp[i] = 0, sum[i] = 1;        }            for(int i=2;i<=len;i++){        if(s[i]==s[i-1]) {        sum[i] ++;             g[i-1][i]=1;        }          }          for(int i=1;i<=len;i++){           g[i][i] = 1; //是回文串符串            for(int j=i-2;j>=1;j--){               if(s[j]==s[i] && g[j+1][i-1]) {               g[j][i] = 1;               sum[i] ++;          }               }            if(i>=2) sum[i] += sum[i-1];        }        for(int i=1;i<=len;i++){            for(int j=i;j>=1;j--){                if(g[j][i])                    dp[i] += sum[j-1];            }            if(i>=2) dp[i] += dp[i-1];        }        cout<<dp[len]<<endl;    }}

原创粉丝点击