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);
    }
}


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

相关文章推荐

HDU 3336 Count the string(KMP)

题目链接:HDU 3336 Count the string(KMP) 题目大意: 求给定字符串前缀重复次数的和。 每个前缀本身重复一次, 再加上所有后缀与前缀匹配的次数就是答...

ACM-KMP之Count the string——hdu3336

Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T...

Hdu-3336 Count the string(KMP + DP)

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...

杭电 hdu 3336 Count the string

/* THE PROGRAM IS MADE BY PYY */ /*-----------------------------------------------------------------...

hdu 3336 Count the string

Count the string TimeLimit: 2000/1000 MS (Java/Others)    Memory Limit:32768/32768 K (Java/Others) T...

hdu 3336 Count the string

Problem Description It is well known that AekdyCoin is good at string problems as well as number th...

HDU 3336 Count the string (next数组活用)

HDU 3336 Count the string (next数组),网上很多人这题的做法都是错的,只能怪数据太水

HDU 3336 Count the string(KMP+DP)

给出一个字符串,输出每个前缀在原串中出现的次数总和。

Hdu 3336 Count the string[KMP next数组的理解]

题意:求字串中【前缀+跟前缀相同的子串】的个数? Sample Input 1 4 abab Sample Output 6 abab:包括2个a,2个ab,1个aba,1个...

HDU 3336 Count the string(kmp)

Problem Description It is well known that AekdyCoin is good at string problems as well as number th...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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