hdu3666 Count the string

原创 2016年06月10日 13:22:29


题意:给你一个字符串,例如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);
    }
}


版权声明:朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

Leetcode全字符问题

目录 1、编号3 Longest Substring Without Repeating Characters 2、编号6 ZigZag Conversion 3、编号20 Valid Parent...
  • wangxiaojun911
  • wangxiaojun911
  • 2014年02月07日 08:09
  • 2823

iOS学习----------FMDB解析

原文:http://www.cnblogs.com/polobymulberry/p/5178770.html 1. 前言 说实话,之前的SDWebImage和AFNetworking...
  • yziOS
  • yziOS
  • 2016年02月23日 22:39
  • 3196

Tomcat源码阅读之闭锁的实现与连接数量的控制

嗯,今天其实在看HtttpProcessor的实现,但是突然想到了以前在看poller的时候看到了有闭锁,用于控制当前connector的连接数量,嗯,那就顺便把这部分来看了。。。 在Tomcat中,...
  • fjs_cloud
  • fjs_cloud
  • 2014年03月25日 19:57
  • 1731

hdu 3336 Count the string

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • hzhyhx1117
  • hzhyhx1117
  • 2012年07月23日 09:44
  • 204

HDU 3336 Count the string

KMP求解每个前缀在串中出现的次数
  • ChiLuManXi
  • ChiLuManXi
  • 2015年12月03日 00:28
  • 293

hdu3336 Count the string

Problem Description It is well known that AekdyCoin is good at string problems as well as number th...
  • magicnumber
  • magicnumber
  • 2012年05月03日 20:31
  • 1687

hdu 3336 Count the string dp+KMP(失配函数)

题意: 代码: #include #include #include #include #include #include #include #inc...
  • a601025382s
  • a601025382s
  • 2014年08月09日 15:17
  • 453

hdu3336Count the string(KMP的next[]数组的应用+KMP模板)

Countthe string TimeLimit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K(Java/Other) Tot...
  • qq_37025443
  • qq_37025443
  • 2017年07月26日 11:06
  • 89

hdu3336Count the string

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • my1995
  • my1995
  • 2014年07月28日 11:39
  • 192

【KMP】 hdu3336 Count the string

Count the string http://acm.hdu.edu.cn/showproblem.php?pid=3336 Problem Description It ...
  • ACM_Ted
  • ACM_Ted
  • 2012年08月02日 11:28
  • 1302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu3666 Count the string
举报原因:
原因补充:

(最多只允许输入30个字)