Remember the Word LA3942



#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <stack>
#include <cctype>
#include <utility>   
#include <map>
#include <string>  
#include <climits> 
#include <set>
#include <string>    
#include <sstream>
#include <utility>   
#include <ctime>

using std::priority_queue;
using std::vector;
using std::swap;
using std::stack;
using std::sort;
using std::max;
using std::min;
using std::pair;
using std::map;
using std::string;
using std::cin;
using std::cout;
using std::set;
using std::queue;
using std::string;
using std::istringstream;
using std::make_pair;
using std::getline;
using std::greater;
using std::endl;
using std::multimap;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PAIR;
typedef multimap<int, int> MMAP;

const int MAXN(400010);
const int SIGMA_SIZE(27);
const int MAXM(110);
const int MAXE(200010);
const int MAXH(18);
const int INFI((INT_MAX-1) >> 2);
const int BASE(131);
const int MOD(20071027);
const ULL LIM(1000000000000000);

int table[300010];

struct TRIE
{
	int ch[MAXN][SIGMA_SIZE];
	int val[MAXN];
	int size;
	inline int idx(char temp)
	{
		return temp-'a';
	}
	void init()
	{
		memset(ch[0], 0, sizeof(ch[0]));
		val[0] = 0;
		size = 1;
	}
	
	void insert(char *S, int tv)
	{
		int u = 0, id;
		for(; *S; ++S)
		{
			id = idx(*S);
			if(!ch[u][id])
			{
				memset(ch[size], 0, sizeof(ch[size]));
				val[size] = 0;
				ch[u][id] = size++;
			}
			u = ch[u][id];
		}
		val[u] = tv;
	}
	
	void DP(char *T, int cur)
	{
		int u = 0, id, len = 0;
		for(; *T; ++T)
		{
			id = idx(*T);
			if(!ch[u][id])
				return;
			u = ch[u][id];
			++len;
			if(val[u])
			{
				table[cur] = table[cur]+table[cur+len];
				if(table[cur] >= MOD)
					table[cur] -= MOD;
			}
		}
	}
};

TRIE trie;

char str[300010];
char tstr[110];

int main()
{
	int n_case(0);
	while(~scanf("%s", str))
	{
		int s;
		scanf("%d", &s);
		trie.init();
		for(int i = 1; i <= s; ++i)
		{
			scanf("%s", tstr);
			trie.insert(tstr, i);
		}
		memset(table, 0, sizeof(table));
		int len = strlen(str);
		table[len] = 1;
		for(int i = len-1; i >= 0; --i)
			trie.DP(str+i, i);
		printf("Case %d: %d\n", ++n_case, table[0]);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值