-
E - String of CCPC
- ZOJ - 3985
- 题意:一个连续的CCPC得到1元,然后你可以花钱买字母插入到字符串中,第i次买花i-1元钱。
- 挣的钱-花的钱,问最后得到的最价值
- 思路:分析的无论怎么加最好的情况为不破坏原来的产生一个新的所以只需看看第一次花0元的时候,
- 能不能有这种最好的情况就行了,先统计一下原来的CCPC数目,然后枚举3种内部情况三种边界情况
- 这6种情况即为插入一个C或P只产生新的不破坏旧的。进行枚举查找这6种子串即可。
- 不用KMP直接跑一边即可,不过KMP优化一下也无妨,
-
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; #define maxn 255555 string str,son[10]; int nxt[maxn],t,sum,n; void pre(int ord,int len) { int j,i; j=nxt[0]=-1; i=0; while(i<len) { while(j!=-1&&son[ord][i]!=son[ord][j]) j=nxt[j]; nxt[++i]=++j; } } int kmp(int ord,int len) { int i=0,j=0,ans=0; while(i<n) { while(-1!=j&&str[i]!=son[ord][j]) j=nxt[j]; i++; j++; if(j>=len) { ans++; j=nxt[j]; } } return ans; } int main() { ios::sync_with_stdio(false); son[0]="CCPC"; son[2]="PCPC"; son[3]="CCPP"; son[4]="CCCC"; cin>>t; while(t--) { int flag=0,temp; cin>>n>>str; pre(0,4); sum=kmp(0,4); if(str[0]=='C'&&str[1]=='P'&&str[2]=='C') flag=1; if(str[n-3]=='C'&&str[n-2]=='C'&&str[n-1]=='C') flag=1; if(str[n-3]=='C'&&str[n-2]=='C'&&str[n-1]=='P') flag=1; if(flag==0) { for(int i=2; i<=4; i++) { pre(i,4); temp=kmp(i,4); if(temp>0) { flag=1; break; } } } sum+=flag; cout<<sum<<endl; } return 0; }
E - String of CCPC ZOJ - 思维+字符串
最新推荐文章于 2022-04-02 12:51:00 发布
本文深入探讨了ZOJ-3985 E-StringofCCPC问题的解决方案,通过分析插入字符的最佳策略来最大化字符串的价值。文章详细解释了如何使用KMP算法优化子串查找,并提供了完整的代码实现。
716

被折叠的 条评论
为什么被折叠?



