文章

5

粉丝

9

获赞

2

访问

3.3k

头像
字符串查询 题解:
P1738 华东师范大学2020年机试题
发布于2024年9月5日 22:46
阅读数 1.1k

个人感觉求出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...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发