-
H - Beautiful Substrings
- Gym - 101972H
- 题意:A beautiful substring is defined as a substring of any length of string b such that
- the first and last letters of it are the same as the first and last letters of any substring of length k of string a.
- 有点绕,意思就是给定两个字符串,然后在a中找任意长度为k的连续子串,会得到很多组 first last 就是那个长度
- 为k的子串的首尾,然后问在b串中任意长度的子串首尾与a中这些长度为k的首尾相同的子串有多少个。
- 思路:在查找a中长度为k的子串首尾类型时注意去重,然后存储这些类型,跑一边b串求一下26种字母的分别的和
- 然后再按照顺序跑一边b,每到一个字符把他的和减一,然后看看以他为首的 first -last 有多少种类型 ,便利一遍
- 这些类型,把当前last 代表的字母的和加起来即可,因为有了这个 从前往后更新删除操作,就不会导致顺序问题
- 与重复问题
-
#include<bits/stdc++.h> using namespace std; #define maxn 110086 #define ll long long vector<int>a[30]; bool vis[30][30]; int t,n,m,k,q1,q2,orz[30]; ll ans; char str[maxn],son[maxn]; int main() { scanf("%d",&t); while(t--) { ans=0; for(int i=0; i<30; i++) a[i].clear(); memset(vis,0,sizeof(vis)); memset(orz,0,sizeof(orz)); scanf("%d%d%d",&n,&m,&k); scanf("%s",str); getchar(); scanf("%s",son); for(int i=0; i<n; i++) { if(i+k-1>=n)break; q1=str[i]-'a'; q2=str[i+k-1]-'a'; if(vis[q1][q2]==0) { vis[q1][q2]=1; a[q1].push_back(q2); } } for(int i=0; i<m; i++) { q1=son[i]-'a'; orz[q1]++; } for(int i=0; i<m; i++) { q1=son[i]-'a'; int len=a[q1].size(); for(int j=0; j<len; j++) { ans+=orz[a[q1][j]]; } orz[q1]--; } printf("%lld\n",ans); } return 0; }
H - Beautiful Substrings Gym - 101972H -思维+求和维护
最新推荐文章于 2021-02-16 16:38:16 发布