标签:using mis 字符串长度 动态规划 rac mes ott strong known
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17918 Accepted Submission(s):
8106
http://acm.hdu.edu.cn/showproblem.php?pid=3336
#include<stdio.h>//网上大佬的代码; #include<iostream> #include<string.h> #include<stack> using namespace std ; const int maxn = 1e6+5; int Next[maxn]; char str[maxn]; char mo[maxn]; int dp[maxn]; int n1,n2; void GetNext() { int i=0,j=-1; while(i<n2) { if(j==-1||mo[i]==mo[j]) {++i,++j,Next[i]=j;} else j=Next[j]; } return ; } /*int kmp() { int cnt=0; int i=0,j=0; while(i<n1) { if(j==-1||str[i]==mo[j]) i++,j++; else j=Next[j]; if(j==n2) { cnt++; j=0; } } return cnt; }*/ int ans[maxn]; int main() { int cnt; int t; scanf("%d",&t); while(t--) { scanf("%d%s",&n2,mo);//n2为字符串长度,mo为字符串; Next[0]=-1; GetNext(); int ans=0; dp[0]=0; for(int i=1;i<=n2;i++){ printf(" %d ###\n",Next[i]); } for(int i=1;i<=n2;i++) { dp[i]=dp[Next[i]]+1;//用动态规划的思维;每一个的值为该后缀的值加一,加一表示其本身,next[i]表示有 //后缀与前缀相同,则后缀与前缀的值相同;前缀的值已经算了; ans=(ans+dp[i])%10007; } printf("%d\n",ans); } return 0; }
#include<cstdio> #include<cstring> const int maxn=2e5+3; char str[maxn]; int Next[maxn],dp[maxn]; int t,len; void getNext(){ Next[0]=-1; int j=0; int k=-1; while(j<len){ if(k==-1||str[k]==str[j]){ k++; j++; Next[j]=k; }else{ k=Next[k]; } } return; } int main(){ scanf("%d",&t); while(t--){ scanf("%d%s",&len,str); getNext(); int ans=0; dp[0]=0; for(int i=1;i<=len;i++){ dp[i]=dp[Next[i]]+1; // printf("%d\n",dp[i]); ans=(ans+dp[i])%10007; } printf("%d\n",ans); } return 0; }
标签:using mis 字符串长度 动态规划 rac mes ott strong known
原文地址:https://www.cnblogs.com/qqshiacm/p/11590521.html