Problem:
replace

Problem Statement

文字列Sが与えられる．
以下の処理をQ個順番に行う．

Sに含まれる文字c_iを全て同時に文字列p_iで置き換える．

最後に文字列SのA文字目からB文字目まで(1-indexed)を出力せよ．

Input

入力は以下の形式に従う．与えられる数は全て整数である．

S
Q A B
c_1 p_1
...
c_Q p_Q

Constraints

1≦Q≦3 \times 10^5

1≦A≦B≦10^{18}

B-A≦10^5

1≦|S|≦10

1≦|p_i|≦10

Sは小文字のアルファベットからなる文字列である．

c_iは小文字のアルファベット1文字である．

p_iは"."(ピリオド)1文字または小文字のアルファベットからなる文字列である．p_i="."(ピリオド)のとき，p_iは空文字列として扱いなさい．

Output

Q個の処理を順に行った後，Bが|S|よりも大きかったときは"."(ピリオド)を1行に出力せよ．

それ以外のときは文字列SのA文字目からB文字目まで(1-indexed)を出力せよ．

Sample Input 1

abaz
3 1 5
a cab
b .
c x

Output for the Sample Input 1

xaxaz

文字列Sは，abaz → cabbcabz → cacaz → xaxazと変化する．

Sample Input 2

original
1 2 5
x notchange

Output for the Sample Input 2

rigi

Sample Input 3

aaaa
2 1 1
a .
a nothing

Output for the Sample Input 3

.

Solution in C (judge verdict: Time Limit Exceeded)

/*
AizuOnline A2493
Title Replace
*/
#include <stdio.h>
// Select Below
//#include <stdlib.h>
#include <string.h>
//#include <float.h>
//#include <math.h>
//#include <limits.h>
//Global data section
char S[11];
int Q;
long long A,B;
struct q_st
{
        char from;
        char tostr[11];
        long long len;
        int  replace[10];
} query[300001];
//
long long calc_len(int n)
{
        int i;
        long long s;
#if DEBUG0
        printf("CL %d\n",n);
#endif
        s=0;
        for(i=0;i<strlen(query[n].tostr);i++)
        {
                if(query[n].replace[i]==0)
                   s ++;
                else
                {
                        s+=calc_len(query[n].replace[i]);
                }
        }
        query[n].len=s;
        return(s);
}
void dump()
{
        int i,j;

        for(i=0;i<=Q;i++)
        {
                printf("%d:%c:",i,i==0?'-':query[i].from);
                printf("%lld:",query[i].len);
                printf("%s|",query[i].tostr);
                for(j=0;j<10;j++)
                        printf("%d:",query[i].replace[j]);
                printf("\n");
        }
}
char find(int num,int q)
{
        int i,runsum,runsum_old;
#ifdef DEBUG2
        printf("FIND %d %d\n",num,q);

#endif
        runsum=0;runsum_old=0;
        for(i=0;i<strlen(query[q].tostr);i++)
        {
                if(!query[q].replace[i])
                        runsum++;
                else
                        runsum+=query[query[q].replace[i]].len;
                if(!(query[q].replace[i]) && runsum_old==num)
                        return(query[q].tostr[i]);
                if(runsum_old <=num && runsum > num)
                        return(find(num - runsum_old,query[q].replace[i]));
                runsum_old = runsum;
        }

}
main()
{
        int i,j,k;
        long long ret;

        scanf("%s ",&query[0].tostr[0]);
        scanf("%d %lld %lld ",&Q,&A,&B);

        for(i=1;i<=Q;i++)
        {
                scanf("%c %s ",&query[i].from,&query[i].tostr[0]);
                for(j=i-1;j>=0;j--)
                        for(k=0;k<strlen(query[j].tostr);k++)
                                if(query[i].from == query[j].tostr[k] && 
                                   !query[j].replace[k])
                                        query[j].replace[k]=i;
        }
#ifdef DEBUG0
        dump();
#endif

        ret=calc_len(0);
#ifdef DEBUG
        dump();
#endif

        if(B>ret)
                printf("-1");
        else
                for(i=A-1;i<=B-1;i++)
                        printf("%c",find(i,0));

     printf("\n");
return(0);
}