感谢铭哥提供的思路:https://blog.csdn.net/DT2131/article/details/54936247
找一个字符串有多少不同子串,利用trie树性质,即为trie树上有多少个不同的节点。
代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
char s[100000];
int ans;
//找一个串不同的子串可用tire树经过每次插入从i到len长度的子串,看tire树中新开的节点个数即不同子串个数
struct Tire{
int next[500000][128];
int rt,cnt;
int newnode()
{
for(int i=0;i<128;i++)
{
next[cnt][i]=-1;
}
ans++;
return cnt++;
}
void init()
{
cnt=0;
rt=newnode();
}
void insert(int k,int len)
{
int now=rt;
for(int i=k;i<len;i++)
{
if(next[now][s[i]]==-1)
{
next[now][s[i]]=newnode();
}
now=next[now][s[i]];
}
}
};
Tire ac;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
ac.init();
ans=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
ac.insert(i,len);
}
printf("%d\n",ans);
}
return 0;
}