文章
5
粉丝
9
获赞
2
访问
3.3k
个人感觉求出f数组的过程更像是dp,而非前缀和,就是要找到状态转移方程。相减的过程倒是确实是前缀和的思想。
设 f[i][j]为字母j在1到i的子串出现次数,那么f[i][j]=f[i−1][j]+(j==c[i]);
求出前缀和后,求a到b子串出现字符j的次数为 f[b][j]−f[a][j−1]
最后判断询问的两个子串所含每个字母的个数是否相同即可。
如果过不了的话加上取消同步 ios::sync_with_stdio(false);
#include<iostream>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int f[50010][30];
int main(){
ios::sync_with_stdio(false);
string s ;
cin>>s;
int q;
cin>>q;
//f[0][0]=0;
int len=s.size();
for(int i=1;i<=len;i++){
for(int j=1;j<=26;j++){
/*if(i==0){
f[i][j]=0;
}*/
f[i][j]=f[i-1][j];
}
f[i][s[i-1]-'a']++;
}
while(q--){
int flag=1;
int a,b,c,d;
cin>>a>>b>>c>>d;
//scanf("%d %d %d %d",&a,&b,&c,&d);
if((b-a)!=(d-c)){
flag=0;
}
else...
登录后发布评论
暂无评论,来抢沙发