题目链接:http://poj.org/problem?id=1200
题目大意:找不同的子串
题目分析:多不错的水题,适合我等菜鸟拉。转化为nc的进制,意味着有ans个不同个数
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int maxn=16*1e6+5;
using namespace std;
char string[maxn];
int letter[30];
bool hash [20000000];
long long sum;
int main()
{
int n,nc,i,j,ans,len,count;
while(scanf("%d %d",&n,&nc)==2)
{
scanf("%s",string);ans=0,count=1;
len=strlen(string);
memset(hash,false,sizeof(hash));
memset(letter,0,sizeof(letter));
for(i=0;i<=len-n;i++)
{
sum = 0;
for(j=i;j<i+n;j++)
{
if(!letter[string[j]-'a']) letter[string[j]-'a']=count++;
sum*=nc;sum+=letter[string[j]-'a'];
}
if(!hash[sum]){hash[sum]=true;ans++;}
}
printf("%d\n",ans);
}
return 0;
}
本文提供了一种解决 POJ 1200 题目的算法思路,通过将字符串问题转化为进制表示来寻找所有不同的子串。使用 C++ 实现,代码简洁高效。
1209

被折叠的 条评论
为什么被折叠?



