码迷,mamicode.com
首页 > 其他好文 > 详细

srm 641

时间:2015-07-19 16:29:28      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

资瓷点这里阅读该文章O_o

250


Solution

水题,最暴力的方法枚举即可

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
map<char, int> s;
int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};
const int N = 55;
int f[N];
bool vis[N];
struct AntsMeet {
    int countAnts(vector <int> x, vector <int> y, string direction) {
        int n = x.size();
        s[‘N‘] = 0, s[‘E‘] = 1, s[‘W‘] = 2, s[‘S‘] = 3;
        for (int i = 0; i < n; ++i) x[i] <<= 1, y[i] <<= 1, f[i] = s[direction[i]], vis[i] = 1;
        for (int i = 1; i <= 4001; ++i) {
            for (int j = 0; j < n; ++j)
                if (vis[j]) {
                    for (int k = j + 1; k < n; ++k)
                        if (vis[k]) {
                            if (x[j] == x[k] && y[j] == y[k])   vis[j] = vis[k] = 0;
                        }
                }
            for (int j = 0; j < n; ++j)
                if (vis[j]) {
                    x[j] += dx[f[j]];
                    y[j] += dy[f[j]];
                }
        }
        int ans = 0;
        for (int i = 0; i < n; ++i) 
            if (vis[i]) ++ans;
        return ans;
    }
};

550


Description

给出串A,B,C,S,F和整数k。以及函数f(x)=A+x+B+x+C。求fk(x)中以F为子串,出现了多少次。答案mod 109+7。串的长度50, k107

Solution

注意到串长度50,以及k107,而且出现F的情况分为在A,B,C三个串中分别出现,以及在交界处出现。由于串的长度比较小,所以我们暴力50次以后,交界处包含F的次数就不再变化了(想一想,为什么)。于是后面的情况我们每次ans=ans×2+t即可。。t是交界处的答案,ansA,B,C中的答案。

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
const int M = 1e9 + 7;
struct AkariDaisukiDiv1 {
    int gao(const string &s, const string &t, int l = 0, int r = 100000000) {
        int tmp = 0;
        for (int i = l; i < s.size() - t.size() + 1 && i < r; ++i)
            if (s.substr(i, t.size()) == t) ++tmp;
        return tmp;
    }
    int countF(string A, string B, string C, string S, string F, int k) {
        int cnt = 0;
        for (; cnt < k && S.size() < F.size(); ++cnt)   S = A + S + B + S + C;
        if (S.size() < F.size())    return 0;
        int ans = gao(S, F), t = 0; 
        string p = S.substr(0, F.size()), q = S.substr(S.size() - F.size(), F.size());
        for (int i = 0; cnt < k && i < 50; ++cnt, ++i) {
            t = gao(A + p, F, 0, A.size()) + gao(q + B + p, F, 1, F.size() + B.size()) + gao(q + C, F, 1);
            ans = (ans + ans + t) % M;
            p = (A + p).substr(0, F.size()), q = (q + C).substr((q + C).size() - F.size(), F.size());
        }
        for (; cnt < k; ++cnt)  ans = (ans + ans + t) % M;
        return ans;
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

srm 641

标签:

原文地址:http://blog.csdn.net/mlzmlz95/article/details/46955353

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!