-
Count the string
- HDU - 3336
- 思路:首先 ans = n 是每个前缀出现一次,下面统计这些前缀作为枚举其中每个位置 作为后缀出现的次数求和即可。
- 这个题要求的 前缀 是包含本身的 ,但是next 中存的是 真后缀,不会重复计数。
-
#include<bits/stdc++.h> using namespace std; #define mod 10007 #define maxn 234567 int nxt[maxn],n,t,ans,dp[maxn]; char str[maxn]; void getnext() { nxt[0]=0; for(int i=1; i<n; i++) { int j=nxt[i-1]; while(j&&str[i]!=str[j]) j=nxt[j-1]; if(str[i]==str[j])nxt[i]=j+1; else nxt[i]=0; } } int dfs(int x) { if(dp[x]!=-1)return dp[x]; if(nxt[x]==0)return 0; return dp[x]=dfs(nxt[x]-1)+1; } int main() { scanf("%d",&t); while(t--) { scanf("%d%s",&n,str); ans=n; getnext(); for(int i=0; i<=n; i++)dp[i]=-1; for(int i=0; i<n; i++) { ans=ans+dfs(i); ans%=mod; } printf("%d\n",ans); } return 0; }
Count the string HDU - 3336-NEXT应用-前缀出现次数
最新推荐文章于 2021-09-01 18:34:55 发布