UPC OJ 一道水题 STL

Problem C: 字符串游戏

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 10  Solved: 3 [Submit][Status][Web Board]

Description

说到游戏,大家还是比较喜欢的,但是玩游戏,如果想赢得对方还是得靠思维的,xy比较喜欢字符串,尤其是起始字母等于终止字母这样的字符串(the string‘s length must exceed one),但是呢,xy有个癖好,喜欢把每个字符重新分配一个值,喜欢的字符给非负数,不喜欢的字符给负数。但是,xy比较喜欢数字0,所以,他决定找到一个字符串中有多少个字串满足起始字母等于终止字母,且除了起始字母和终止字母外其他字母的和为0。但是xy最近比较忙,希望你能帮助他。

Input

第一行包含26个整数xi,xi属于[-100000,100000],非别代表着小写字母a,b,c,....,z的值。

第二行一个只包含小写字母的字符串,长度你自己猜,算了,给你个范围,length between 1 and 100000.

Output

输出答案,每个答案占一行。

Sample Input

1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 8 1 1 1 1 1 1
xabcab

Sample Output

2

题目分析:

每种字母的字符串求一遍,预处理前缀和,每次查找到一个位置i,查询前面有多少与sum[i-1]相同的以该子母为结尾的sum[j],用mp实现,总复杂度O(nlogn)刚开始用了multiset中的count函数,总是超时,最后据我推断,那是因为count函数的时间复杂度是O(klogn),k是相同的个数,唉,还是太年轻。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<cstdlib>
#include<queue>
#include<map>
using namespace std;
typedef long long LL;
char s[100005];
LL a[26],sum[100005];
map<LL,int>mp;
vector<int>b[26];
int main()
{
    for(int i=0; i<26; ++i)
        scanf("%lld",&a[i]);
    scanf("%s",s+1);
    int len=strlen(s+1);
    sum[0]=0;
    long long ans=0;
    for(int i=1; i<=len; ++i)
    {
        int c=s[i]-‘a‘;
        sum[i]=sum[i-1]+a[c];
        b[c].push_back(i);
    }
    for(int i=0; i<26; ++i)
    {
        mp.clear();
        for(int j=0; j<b[i].size(); ++j)
        {
            if(j>0)ans+=mp[sum[b[i][j]-1]];
            mp[sum[b[i][j]]]++;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

/**************************************************************
    Problem: 3285
    User: 1407010221
    Language: C++
    Result: Accepted
    Time:204 ms
    Memory:2956 kb
****************************************************************/


				
时间: 2024-11-03 22:22:02

UPC OJ 一道水题 STL的相关文章

碰到日期题就怕的我来写一道水题吧

HDOJ-2005, http://acm.hdu.edu.cn/showproblem.php?pid=2005 20XX系列的水题哈哈,写了二十分钟,就为找到一种比较正常不傻逼的写法... 嗯,学习了一下,闰年的判断可以写成一个接受参数的宏. #define lev(n) (n%4==0&&(n%100!=0||n%400==0)) 然后建立一个二维数组来存储闰年和非闰年的每月天数. int calendar[2][13] = { {0,31,28,31,30,31,30,31,31,

UVa 10391 (水题 STL) Compound Words

今天下午略感无聊啊,切点水题打发打发时间,=_=|| 把所有字符串插入到一个set中去,然后对于每个字符串S,枚举所有可能的拆分组合S = A + B,看看A和B是否都在set中,是的话说明S就是一个复合词. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 #include <

POJ 2028 When Can We Meet? (又是一道水题)

[题目简述]:N代表有几个会员,Q代表有几个会员的时候开会才算做有效,接下来N行,每行第一个数字代表这行有M个数,说明这个会员在哪几天有时间.最后让我们求出  最快  哪天开会. [分析]:简单题,见代码. // 248K 47Ms #include<iostream> using namespace std; int M[101]; int N,Q; int main() { int m; int m1; while(1) { cin>>N>>Q; if(N == 0

POJ 2501 Average Speed(不错的一道水题)

[题目简述]:给出我们时间和速度,让我们求出走了多远的距离 [分析]:这道题开始的时候没有太明白什么时候输出,后来看了别人的题解就明白了. 关于此题的几点总结: 1.时间的输入方法:scanf("%d:%d:%d",&h,&m,&s),注意积累! 2.关于空格的的输入控制使用char ch = getchar(),同时它还作为了本题的一个是否输出的标识控制的条件. 3.多积累类似题目的方法. 代码参考http://blog.csdn.net/yujuan_mao

UVa 1593 (水题 STL) Alignment of Code

话说STL的I/O流用的还真不多,就着这道题熟练一下. 用了两个新函数: cout << std::setw(width[j]);    这个是设置输出宽度的,但是默认是在右侧补充空格 所以就要用cout.setf(ios::left);来设置一下左对齐. 1 #include <iostream> 2 #include <cstdio> 3 #include <sstream> 4 #include <vector> 5 #include &l

2018焦作网络赛 - Poor God Water 一道水题的教训

本题算是签到题,但由于赛中花费了过多的时间去滴吧格,造成了不必要的浪费以及智商掉线,所以有必要记录一下 题意:方格从1到n,每一格mjl可以选择吃鱼/巧克力/鸡腿,求走到n格时满足 1.每三格不可重复同一种食物 2.每三格均不同食物时中间格子不可吃巧克力 3.每三格前后两格不可同时吃巧克力 以上三个条件的方案数,n<1e10 太长不看版:打表+快速幂AC 长篇吐槽版 很显然的,设\(dp[n][i][j][k]\),走到第\(n\)格时第\(n-2\)格的食物是\(i\),第\(n-1\)的食物

SDNU 1536.How many users on SDNU OJ(水题)

Description There are many users on SDNU OJ, but only the one who registered can use it. We think different username represent different user. One day ZhouXiaohui got a record of "Status Pages", the captain Albert_s wants to know how many users

一道水题。。时间复杂度有问题

POJ 2726 Holiday Hotel 一道水题

貌似是当年楼教主出的题目. 有N个旅店,两个属性,距离D,价格C.选择旅店,若选择M 1.比M近的,价格比它高 2.比M便宜的,距离比它远 求有多少个这样的旅店 ① 暴力做法 两次排序,按照不同的关键字.然后扫描,过程中记录下前面另一个关键字的最小值,然后比较.若数组中sel为2则是. #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<alg