2019上海赛区网络赛(C,G)

7题弟弟。

提交次数最多的两题是C和G,这里决定写一下。

G:

一眼题,题目即是问,给定字符串T,有多少S的子区间s,满足s和T的首尾相同,中间的那些字母每一种的个数相同。不难想到hash。

因为时限比较长,所以可以暴力一点的,把询问长度相同的拿出来一块处理。  这样的不同种类<sqrt种。 所以总的复杂度就是O(NsqrtN*k)。k是hash的复杂度,我开始用unorderedmap存的,T了,然后改成二分才过了。

可以参考CF963D的hash做法。 吃饭了先

#include<bits/stdc++.h>
#define ll unsigned long long
#define pui pair<ll,int>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=100010;
const int seed=131;
char a[maxn],b[maxn];
vector<pui>s[maxn];
ll p[150];  int ans[maxn];
ll h[maxn],cnt;
int L[maxn],tot,M,N;
inline void read(int &x){
    x=0; char c=getchar();
    while(c>‘9‘||c<‘0‘) c=getchar();
    while(c>=‘0‘&&c<=‘9‘) x=x*10+c-‘0‘,c=getchar();
}
inline void P(int x)
{
    if(x>9) P(x/10);
    putchar(x%10+‘0‘);
}
inline void Get()
{
    M=1; b[M]=getchar();
    while(b[M]>‘z‘||b[M]<‘a‘)
        b[M]=getchar();
    while(b[M]>=‘a‘&&b[M]<=‘z‘) b[++M]=getchar();
    M--;
}
inline void GetA()
{
    N=1; a[N]=getchar();
    while(a[N]>‘z‘||a[N]<‘a‘)
        a[N]=getchar();
    while(a[N]>=‘a‘&&a[N]<=‘z‘) a[++N]=getchar();
    N--;
}
int main()
{
    int T,Q;
    read(T);
    p[0]=1; rep(i,1,149) p[i]=p[i-1]*seed;
    while(T--){
        GetA(); read(Q);
        tot=0;
        rep(i,1,Q){
            Get();
            ll now=0; L[++tot]=M;
            rep(j,2,M-1) {
                now+=p[b[j]];
            }
            now+=p[123]*b[1];
            now+=p[124]*b[M];
            s[M].push_back(pui(now,i));
        }
        sort(L+1,L+tot+1);
        tot=unique(L+1,L+tot+1)-(L+1);
        rep(k,1,tot){
            int i=L[k];
            ll now=0,tmp; cnt=0;
            rep(j,1,N){
                if(j>1) now+=p[a[j-1]];
                if(j>=i){
                    now-=p[a[j-i+1]];
                    tmp=(now+p[123]*a[j-i+1]+p[124]*a[j]);
                    h[++cnt]=tmp;
                }
            }
            sort(h+1,h+cnt+1);
            rep(j,0,s[i].size()-1) {
                int p1=upper_bound(h+1,h+cnt+1,s[i][j].first)-h;
                int p2=lower_bound(h+1,h+cnt+1,s[i][j].first)-h;
                ans[s[i][j].second]=p1-p2;
            }
            s[i].clear();
        }
        rep(i,1,Q) {
            P(ans[i]);
            putchar(‘\n‘);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/11523646.html

时间: 2024-10-12 15:31:23

2019上海赛区网络赛(C,G)的相关文章

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 5053 the Sum of Cube---2014acm上海赛区网络赛

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5053 the Sum of Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 140    Accepted Submission(s): 80 Problem Description A range is given, the b

hdu 5050 Divided Land---2014acm上海赛区网络赛

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5050 Divided Land Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 115    Accepted Submission(s): 57 Problem Description It's time to fight the loc

hdu 4023 2011上海赛区网络赛C 贪心+模拟

以为是贪心,结果不是,2333 贪心最后对自己绝对有利的情况 点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000000

hdu 4025 2011上海赛区网络赛E 压缩 ***

直接T了,居然可以这么剪枝 题解链接:点我 1 #include<cstdio> 2 #include<map> 3 #include<cstring> 4 #define ll __int64 5 using namespace std; 6 ll a[23],x[23][5],ans; 7 map<ll,ll>p; 8 void dfs(int d,int n,ll res,int f) 9 { 10 if(d==n){ 11 if(f) p[res]+

hdu 4028 2011上海赛区网络赛H dp+map离散

一开始用搜索直接超时,看题解会的 1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<cstring> 5 #include<cmath> 6 #include<vector> 7 #include<queue> 8 #include<algorithm> 9 #include<set> 10 #define inf

hdu 4027 2011上海赛区网络赛 线段树 成段平方根 ***

不能直接使用成段增减的那种,因为一段和的平方根不等于平方根的和,直接记录是否为1,是1就不需要更新了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #de

2019上海icpc网络赛B. Light bulbs(思维+差分)

题目传送门 题意 T组案例,每组案例:n个灯泡(from 0 to n-1),m次操作,每次操作把区间[L,R]内的灯泡翻转(开变关,关变开),问m次操作之后有多少灯泡是亮着的.(时间限制:1000ms  内存限制:8192K) 题解 这道题不仅卡时间,更是卡内存,所以用线段树会爆内存 正解: 该题可以转换为经典的差分问题:每次操作对[L,R]的所有数进行+1操作,求最后有多少个奇数.(设该数组为a[n],每次操作a[L]+1,a[R+1]-1,求前缀和sum[i]=sum[i-1]+a[i]即

2019 ICPC 南昌网络赛

2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 // 史上排名最高一次,开场不到两小时队友各A一题加水题共四题,排名瞬间升至三四十名 // 然后后三小时就自闭了,一题都没有突破...最后排名211 hhhh ? ? B. Fire-Fighting Hero 题意 队友做的,待补. ? AC代码 #include<cstdio> #includ