wanimaru47's diary

プログラミング等々

code thanks festival 2014 B日程

B日程参加してきました。

AからEまでやるだけでF、G、Hの三問が本命の問題という感じがしましたね。
F問題まではけっこう順調に進んで、焼く肉食べれるかと思いましたが、
G問題とH問題が解けなくて残念な結果になりました。

オンサイトでは13位で、オンライン合わせると70位ぐらいで
今まででは、なかなかいい感じの結果が残せた方なので
楽しめた数少ないコンテストの一つになった気がしますw

F問題だけ載せておきます。

#include <iostream>
#include <sstream>
#include <cstdio>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>
#include <list>
#include <stack>
#include <queue>
#include <cstdlib>
#include <tuple>
#define INF 1e9
#define EPS 1e-9
#define MOD 1000000007
using namespace std;

typedef list<int> L;
typedef pair <int,int> P;
typedef vector<int> V;
typedef queue<int> Q;
typedef stack<int> S;
typedef map<string,int> M;

string s, v, t;

int main()
{
    cin >> s >> v >> t;
    V res(s.size() + 1, 0);

    bool flag = true;
    for (int i = 0; i < v.size(); i++) {
        if (v[i] != s[i]) flag = false;
    }
    if (flag) res[v.size()] = 1;

    flag = true;
    for (int i = 0; i < t.size(); i++) {
        if (t[i] != s[i]) flag = false;
    }
    if (flag) res[t.size()] = 1;


    for (int i = 1; i < s.size(); i++) {
        if (res[i]) {
            int j = 0;
            flag = true;
            while (j < v.size()) {
                if (s[i+j] != v[j]) flag = false;
                j++;
            }
            if (flag) res[i+v.size()] += res[i];
            res[i+v.size()] %= MOD;
            j = 0;
            flag = true;
            while (j < t.size()) {
                if (s[i+j] != t[j]) flag = false;
                j++;
            }
            if (flag) res[i+t.size()] += res[i];
            res[i+t.size()] %= MOD;
        }
    }
    cout << res[s.size()] << endl;

    return 0;
}