Beautiful Substrings Gym
阿新 • • 發佈:2018-12-20
- 題意: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; }