您的位置:首页 > 大数据 > 人工智能

POJ 3007 Organize Your Train part II(Trie树)

2013-02-18 20:41 357 查看
题目链接

注意不要用memset,手写初始化。 直接map TLE,然后哈希字符串同样TLE了。。换了方法终于水过去了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
using namespace std;
int len;
int trie[100001][26];
int ans,tt;
char s[101];
void cat(char *s1,char *s2,int n)
{
int i,num,z;
num = 0;
for(i = 0; i <= n; i ++)
{
if(!trie[num][s1[i]-'a'])
{
ans ++;
trie[num][s1[i]-'a'] =  ans;
num = ans;
}
else
{
num = trie[num][s1[i]-'a'];
}
}
for(i = n+1; i < len; i ++)
{
if(!trie[num][s2[i-n-1]-'a'])
{
ans ++;
trie[num][s2[i-n-1]-'a'] =  ans;
num = ans;
z = 0;
}
else
{
num = trie[num][s2[i-n-1]-'a'];
z = 1;
}
}
if(z == 0)
{
tt ++;
}
}
int main()
{
int t,i,j,k;
char str[101];
char s1[101],s2[101],s3[101],s4[101];
scanf("%d",&t);
while(t--)
{
for(i = 0;i <= ans;i ++)
{
for(j = 0;j <= 25;j ++)
trie[i][j] = 0;
}
tt = ans = 0;
scanf("%s",str);
len = strlen(str);
if(len == 1)
{
printf("1\n");
continue;
}
for(i = 0; i < len-1; i ++)
{
for(j = 0; j <= i; j ++)
{
s1[j] = str[j];
s2[i-j] = str[j];
}
s1[i+1] = '\0';
s2[i+1] = '\0';
for(j = i+1; j < len; j ++)
{
s3[j-i-1] = str[j];
}
for(j = len-1,k = 0; j >= i+1; j --,k ++)
{
s4[k] = str[j];
}
s3[len-i-1] = '\0';
s4[len-i-1] = '\0';
cat(s1,s3,i);
cat(s1,s4,i);
cat(s2,s3,i);
cat(s2,s4,i);
cat(s3,s1,len-i-2);
cat(s3,s2,len-i-2);
cat(s4,s1,len-i-2);
cat(s4,s2,len-i-2);
}
printf("%d\n",tt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: