您的位置:首页 > 产品设计 > UI/UE

Codeforces 245H Queries for Number of Palindromes

2016-06-28 16:00 591 查看
http://codeforces.com/contest/245/problem/H

题意:给定一个字符串,每次给个区间,求区间内有几个回文串(n<=5000)

思路:设定pd[i][j]代表i~j这部分是不是一个回文串,这个可以n^2预处理

然后设定f[i][j]代表i~j区间有多少个回文串,由于满足区间加减,因此有

f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+pd[i][j]

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
int pd[5005][5005],f[5005][5005],n;
char s[20005];
int read(){
int t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}
void init(){
for (int i=1;i<=n;i++)
pd[i][i]=1;
for (int len=2;len<=n;len++)
for (int i=1;i+len-1<=n;i++){
int j=i+len-1;
if (i==j-1&&s[i]==s[j]) pd[i][j]=1;
else
if (s[i]==s[j]) pd[i][j]|=pd[i+1][j-1];
}
for (int i=1;i<=n;i++)
f[i][i]=1;
for (int i=1;i<n;i++)
if (s[i]==s[i+1])
f[i][i+1]=3;
else
f[i][i+1]=2;
for (int len=3;len<=n;len++)
for (int i=1;i+len-1<=n;i++){
int j=i+len-1;
f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+pd[i][j];
}
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
init();
int T=read();
while (T--){
int l=read(),r=read();
printf("%d\n",f[l][r]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: