zoukankan      html  css  js  c++  java
  • 2020杭电多校联合训练(第四场) E.Equal Sentences (dp)

    题面

    Problem Description
    Sometimes, changing the order of the words in a sentence doesn't influence understanding. For example, if we change "what time is it", into "what time it is"; or change "orz zhang three ak world final", into "zhang orz three world ak final", the meaning of the whole sentence doesn't change a lot, and most people can also understand the changed sentences well.

    Formally, we define a sentence as a sequence of words. Two sentences S and T are almost-equal if the two conditions holds:

    1. The multiset of the words in S is the same as the multiset of the words in T.
    2. For a word α, its ith occurrence in S and its ith occurrence in T have indexes differing no more than 1. (The kth word in the sentence has index k.) This holds for all α and i, as long as the word α appears at least i times in both sentences.

    Please notice that "almost-equal" is not a equivalence relation, unlike its name. That is, if sentences A and B are almost-equal, B and C are almost-equal, it is possible that A and C are not almost-equal.

    Zhang3 has a sentence S consisting of n words. She wants to know how many different sentences there are, which are almost-equal to S, including S itself. Two sentences are considered different, if and only if there is a number i such that the ith word in the two sentences are different. As the answer can be very large, please help her calculate the answer modulo 109+7.

    Input
    The first line of the input gives the number of test cases, T(1≤T≤100). T test cases follow.

    For each test case, the first line contains an integer n(1≤n≤105), the number of words in the sentence.

    The second line contains the sentence S consisting of n words separated by spaces. Each word consists of no more than 10 lowercase English letters.

    The sum of n in all test cases doesn't exceed 2×105.

    Output
    For each test case, print a line with an integer, representing the answer, modulo 109+7.

    Sample Input
    2
    6
    he he zhou is watching you
    13
    yi yi si wu yi si yi jiu yi jiu ba yao ling

    Sample Output
    8
    233

    思路

    基础dp,我们枚举是否交换这个单词和前面一个单词,那么状态就从dp[i-2]和dp[i-1] 转移了过来,边界注意0和1的下标值都为1;

    代码实现

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define rep(i,f_start,f_end) for (int i=f_start;i<=f_end;++i)
    #define per(i,n,a) for (int i=n;i>=a;i--)
    #define MT(x,i) memset(x,i,sizeof(x) )
    #define rev(i,start,end) for (int i=0;i<end;i++)
    #define inf 0x3f3f3f3f
    #define mp(x,y) make_pair(x,y)
    #define lowbit(x) (x&-x)
    #define MOD 1000000007
    #define exp 1e-8
    #define N 1000005 
    #define fi first 
    #define se second
    #define pb push_back
    typedef long long ll;
    typedef pair<int ,int> PII;
    ll gcd (ll a,ll b) {return b?gcd (b,a%b):a; }
    const int maxn=1e5+10;
    const int mod=1e9+7;
    int dp[maxn];
    string ss[maxn];
    int n;
    
    int main () {
       int t;
       cin>>t;
       while (t--) {
           cin>>n;
           rep (i,1,n) cin>>ss[i];
           MT (dp,0);
           dp[0]=dp[1]=1;
           rep (i,2,n) {
               if (ss[i]!=ss[i-1]) dp[i]=(dp[i]+dp[i-2])%mod;
               dp[i]+=dp[i-1];
               dp[i]%=mod; 
           }
           cout<<dp[n]<<endl;
       }
    
       return 0;
    }
    
  • 相关阅读:
    oracle 数据库服务名怎么查
    vmware vsphere 6.5
    vSphere虚拟化之ESXi的安装及部署
    ArcMap中无法添加ArcGIS Online底图的诊断方法
    ArcGIS中字段计算器(高级计算VBScript、Python)
    Bad habits : Putting NOLOCK everywhere
    Understanding the Impact of NOLOCK and WITH NOLOCK Table Hints in SQL Server
    with(nolock) or (nolock)
    What is “with (nolock)” in SQL Server?
    Changing SQL Server Collation After Installation
  • 原文地址:https://www.cnblogs.com/hhlya/p/13408648.html
Copyright © 2011-2022 走看看