zoukankan      html  css  js  c++  java
  • 2015-2016ACM-ICPC NEER northern-subregional-contest C Concatenation

    可以在这里提交: http://codeforces.com/gym/100801

    题目大意:

    给出两个由小写字母组成的字符串S,T,从S中取一个非空前缀,从T中取一个非空后缀,拼接成一个新的字符串。  问这样能得到多少本质不同的新字符串。

    |S|,|T|<=1e5

    题解:

    考虑拼接得到的一个串X,用can[i]=1表示可以用S的前i个字符和T的某个后缀拼接出X。

    有一个很重要的性质就是 can[i]=1的段是连续的,也就是说 如果 can[i]=1 can[j]=1 那么 can[k]=1  (i<=k<=j)  在纸上画一下就知道了。 

    那么如果对于一个串X,统计出有多少个i使得can[i]=can[i+1] 就是重复的次数。

    再来看什么情况下can[i]=can[i+1]:

    设|S|=n, |T|=m,|X|=l  字符串下标从1开始。

    can[i]=can[i+1]  <->   S[i+1]=T[m-(l-i)+1]. 

    所以S中和T中一组相等字符 就对应了 一种 重复的情况。  因此只要统计出S和T中每个字母出现多少次从总数减去就好了。

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <vector>
     6 #include <map>
     7 using namespace std;  
     8   
     9 typedef long long ll;
    10 #define N 100100  
    11 map<int,int> mp1,mp2;  
    12   
    13 char s1[N],s2[N];
    14 int main()  
    15 {  
    16     freopen("concatenation.in","r",stdin);
    17     freopen("concatenation.out","w",stdout);
    18     
    19     while (scanf("%s%s",s1,s2)!=EOF)
    20     {
    21         mp1.erase(mp1.begin(),mp1.end());
    22         mp2.erase(mp2.begin(),mp2.end());
    23         int n=strlen(s1),m=strlen(s2);
    24         for (int i=1;i<n;i++) mp1[s1[i]]++;
    25         for (int i=0;i<m-1;i++) mp2[s2[i]]++;
    26         ll ans=1ll*n*m;
    27         for (int c='a';c<='z';c++) ans-=1ll*mp1[c]*mp2[c];
    28         printf("%I64d
    ",ans);
    29     }
    30     return 0;  
    31 }  
    View Code

    注意在CF上交的时候要用文件输入输出...


    加强版:  如果给出多个字符串, 可以任选一个串的前缀和另外一个串的后缀拼接应该怎么做?

    只要建一棵prefix trie和suffix trie,答案就是两棵树节点数的乘积 减去sum(cnt1[c]*cnt2[c]) cnt1[c],cnt2[c]分别表示字母c在两棵树中出现的次数。

  • 相关阅读:
    Jquery复习DAY1(jQuery 选择器 jQuery 样式操作 jQuery 效果)
    git知识
    简单分析vue计算属性和methods方法的区别
    vue生命周期
    elementUI的级联选择器Cascader 高度不匹配问题高度溢出错误
    .Net Core3.1 常用的服务注入
    判断是否为AJAX请求
    JWT权限验证
    CodeSmith介绍
    常见ORM介绍
  • 原文地址:https://www.cnblogs.com/vb4896/p/6673744.html
Copyright © 2011-2022 走看看