字符串(1)题集

【字典树】

数组模板

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define idx(x) x - 'a';
const int MAXN = 1e6;
struct Trie 
{
	int next[26];
	int val;
}tree[MAXN];
int nxt, T;
char str[MAXN];
int add()
{
	memset(&tree[nxt], 0, sizeof(Trie));
	return nxt++;
}
void Insert(char *s)
{
	int rt = 0, len = strlen(s);
	for(int i = 0; i < len; i++) 
	{
		int c = idx(s[i]);
		if(!tree[rt].next[c]) 
		{
			tree[rt].next[c] = add();
		}
		rt = tree[rt].next[c];
	}
	tree[rt].val++;
}
bool Find(char *s)
{
	int rt = 0, len = strlen(s);
	for(int i = 0; i < len; i++) 
	{
		int c = idx(s[i]);
		if(!tree[rt].next[c]) return false;
		rt = tree[rt].next[c];
	}
	if(tree[rt].val) return true;
	return false;
}
int main()
{
	memset(&tree[0], 0, sizeof(Trie));
	nxt = 1;
	scanf("%d", &T);
	while(T--) 
	{
		scanf("%s", str);
		Insert(str);
	}
	while(~scanf("%s", str)) 
	{
		if(Find(str)) puts("exist");
		else puts("none");
	}
	return 0;
}


POJ 2001 Shortest Prefixes(求字符串非公共的最短前缀,记录每个节点上的单词数)

HDU 1671 Phone List (也就是 POJ 3630 Phone List)

如果有前缀存在,一共就两种可能性

1、短的出现在长的前面

2、短的出现在长的后面

这一题其实也可以不用字典树的

字典树版

#include 
#include 
#include 
#include  
#include 
using namespace std;
char s[100005][15],str[25];
int nxt,flag;
struct Trie
{
	int next[26];
	int val;
}tree[100005];
int add()
{
	memset(tree[nxt].next, 0, sizeof(tree[nxt].next));
	tree[nxt].val=0;
	return nxt++;
}
void insert(char *st)
{
	int rt=0,len=strlen(st);
	int ff=0;
	for(int i=0;i0) flag=0;
			ff=1;
		}
		rt=tree[rt].next[c];
	}
	tree[rt].val++;
	if(ff==0) flag=0;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		nxt=1;
		int n;
		scanf("%d",&n);
		flag=1;
		memset(s,'\0',sizeof(s));
		memset(tree,0,sizeof(tree));//一定要注意,没有清零wa了好久,所以贴个代码纪念一下 
		for(int i=0;i

非字典树版

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	string str[10010];
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=0;i>str[i];
		}
		sort(str,str+n);//排序之后,如果存在前缀关系,那么排序后,长的必定出现在短的后一个 
		int flag=0;
		for(int i=0;i

这个用了c++的一些知识点

string在c++中的用法http://jingyan.baidu.com/article/20b68a8854f919796dec6265.html

HDU 1247 Hat’s Words

可以试试用string+map的方法

HDU 2846 Repository 

【KMP】

【ac自动机】



你可能感兴趣的:(字符串(1),===,数据结构,===,字符串)