关闭

hdu3666 Count the string

77人阅读 评论(0) 收藏 举报


题意:给你一个字符串,例如abab,他的前缀有a,ab,aba,abab,求这些前缀在串中能被匹配的次数。abab 就是 2+2+1+1=6.这题数据很弱,例如 5 aaaaa的数据应该是15 8 abababab应该是 20

思路:数据很弱,所以可以暴力(O^2),做法是先扫一遍与第一个相同的位置记录下来,将记录的位置作为起点比较串下一位,相同就记录,依次从串的第一个到最后一个。

#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+10,mod=10007;
char s[maxn];
int main()
{
    int T;scanf("%d",&T);
    while(T--){
        int len;
        scanf("%d %s",&len,s);
        int b[len+1];
        int t=0,ans=0;
        for(int i=0;i<len;i++){
            if(s[i]==s[0]){
                ans=(ans+1)%mod;
                b[t++]=i;
            }
        }
        for(int i=1;i<len;i++){
            int temp=t;
            t=0;
            for(int j=0;j<temp;j++){
                if(s[b[j]+1]==s[i]){
                    b[t++]=b[j]+1;
                    ans=(ans+1)%mod;
 }
            }
        }
        printf("%d\n",ans%mod);
    }
}

借助kmp算法的next[]数组可以优化到O(n),next[i]表示前i-1位的子串出现前后缀相等的位置。我们设num[i]表示前-1子串里前缀出现匹配的个数。

我们有转移方程: num[i]=num[next[i]]+1;

#include<bits/stdc++.h>
using namespace std;
const int maxn=200010,mod=10007;
int Next[maxn],num[maxn];
char s[maxn];
void get_next(char *s,int *nxt,int len)
{
   memset(nxt,0,sizeof(nxt));
   nxt[0]=-1;
   int i=0,j=-1;
   while(i<len){
      if(j==-1||s[i]==s[j]) nxt[++i]=++j;
      else j=nxt[j];
   }
}

int main()
{
    int T;scanf("%d",&T);
    while(T--){
        int len;scanf("%d",&len);
        scanf("%s",s);
        get_next(s,Next,len);
        memset(num,0,sizeof(num));
        int ans=0;
        for(int i=1;i<=len;i++){
            num[i]=(num[Next[i]]+1)%mod;
            ans=(ans+num[i])%mod;
        }
        printf("%d\n",ans);
    }
}


0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:76063次
    • 积分:3669
    • 等级:
    • 排名:第8837名
    • 原创:290篇
    • 转载:18篇
    • 译文:0篇
    • 评论:12条
    欢迎交流QQ
    欢迎与我交流有关于ACM算法,机器学习等你所学习的内容,故事
    最新评论