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]
题意:给定一个字符串,每次给个区间,求区间内有几个回文串(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; }
相关文章推荐
- 高效读写的队列:深度剖析ConcurrentLinkedQueue
- Android UI线程和非UI线程
- iOS将UIImage设置为圆角
- request中的方法小结
- UINavigationController、UITabBarController
- 导致UIButton半透明的原因
- UITextField 全属性
- Sprite (2D and UI)
- Android 更新UI的两种方式--Handler & runOnUiThread
- android进行异步更新UI的四种方式
- UIView 中常见的方法总结
- easyui dataGrid 动态添加列
- android的BuildConfig学习
- Workqueue的应用
- Android酷炫实用的开源框架(UI框架)
- SpannableString&SpannableStringBuilder定制文本
- IOS UIProgressView控件用法(进度条)
- The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported.
- vuejsLearn---通过手脚架快速搭建一个vuejs项目
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别