题目大意:就是给出一个字符串,求最大前缀的长度,可以用DP+字典树求解1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118/*
ID:shiryuw1
PROG:prefix
LANG:C++
*/
using namespace std;
const int MAX=5020;
char str[200005]={0};
struct progtrie{
	int a[26];
	bool hash;
}trie[MAX];
int tree=1;
int maxpre=-1;
int vis[200005]={0};
bool isin(char *ch)
{
	int i;
	int k=0;
	for(i=0;ch[i]!=0;i++)
	{
		k=trie[k].a[ch[i]-'A'];
		if(k==0)
		{
			return false;
		}
	}
	if(k==0||trie[k].hash==false)
		return false;
	return true;
}
int main()
{
	freopen("prefix.in","r",stdin);
	freopen("prefix.out","w",stdout);
	int i,ii;
	for(i=0;i<MAX;i++)
	{
		for(ii=0;ii<26;ii++)
		{
			trie[i].a[ii]=0;
		}
		trie[i].hash=false;
	}
	while(1)
	{
		char ch[20];
		cin>>ch;
		if(ch[0]=='.')
			break;
		int k=0;
		for(i=0;ch[i]!=0;i++)
		{
			if(trie[k].a[ch[i]-'A']==0)
			{
				trie[k].a[ch[i]-'A']=tree;
				tree++;
			}
			k=trie[k].a[ch[i]-'A'];
		}
		trie[k].hash=true;
	}
	getchar();
	char ch[100]={0};
	while(cin>>ch)
	{
		strcat(str,ch);
	}
	bool ans=true;
	int len=strlen(str);
	int maxlength=0;
	for(i=1;i<=len;i++)
	{
		int length=0;
		int j;
		for(j=1;j<=10;j++)
		{
			int x;
			if(i>=j)
			{
				if(vis[i-j]!=(i-j))
					continue;
				ans=false;
				int y=0;
				for(x=i-j;x<i;x++)
				{
					ch[y]=str[x];
					y++;
				}
				ch[y]=0;
				if(isin(ch))
				{
					if(vis[i-j]+y>length)
					{
						length=vis[i-j]+y;
					}
				}
			}
		}
		vis[i]=length;
		if(length>maxlength)
			maxlength=length;
		if(ans)
			break;
	}
	cout<<maxlength<<endl;
	return 0;
}