• 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;
    }
    
  • 相关阅读:
    Ddr2,ddr3,ddr4内存条的读写速率
    Ddr2,ddr3,ddr4内存条的读写速率
    【VS开发】获取CPU tick tick 周期
    【VS开发】获取CPU tick tick 周期
    【VS开发】malloc申请内存错误分析
    【VS开发】malloc申请内存错误分析
    【VS开发】Return与Exit的区别
    【VS开发】Return与Exit的区别
    【VS开发】C/C++预编译命令
    【VS开发】C/C++预编译命令
  • 原文地址:https://www.cnblogs.com/hhlya/p/13408648.html
Copyright © 2020-2023  润新知