不知道这段代码怎么了,错这么多,麻烦大佬指点一下下...
#include<bits/stdc++.h>
using namespace std;
const int N=10086,base=10086;
const long long mod=100861008610086;
int n;
char a[N],b[N];
long long t[N*N];//初始化
int main()
{
scanf("%d%s%s",&n,a+1,b+1);//输入,a和b加1是往后移1位,即原本输入下标是从0开始到strlen()-1,而这里是从1开始到strlen()
for(int i=1;i<=n;i++)//固定i不动,让j从i往后移到。i是什么?看题。
{
long long v=0;
int p=1;//p初始化为1因为要从第一位开始扫过去
for(int j=i;j<=n;j++)//稳定b的某一位进行比较,因为b的限制更多
{
while(p<=n&&a[p]!=b[j])//判断p是否大于位数,且a和b是否相等
{
p++;//如果不相等,p加一位,继续下一位判断a和b是否相等
}
if(p>n)//如果p大于位数,则说明已经检查完,退出此循环
{
break;
}
p++;//p要加1位因为下一个循环还需要使用p来检查下一位
v=(v*base+b[j]-'a')%mod;
t[++t[0]]=v;//++t[0]既是让t的下标加1,也是计数。
}
}
sort(t+1,t+t[0]+1);//一般使用unique之前都要排序
printf("%d\n",unique(t+1,t+t[0]+1)-t-1);//unique函数在这里返回的是去重后的不重复数列中最后一个元素的下一个地址,如果需要计算该地址所对应的下标,则用unique(a,a+n)-a即可,在这里,因为我们的数组的下标是从1而不是0开始,所以还要减1【毕竟我们是(t+1,t+t[0]+1)而不是(t,t+t[0])】
return 0;
}